在球拍中实施bst

时间:2013-11-08 14:44:33

标签: functional-programming scheme racket binary-search-tree

我正在尝试在球拍中实现bst(二进制搜索树)。 bst是一个递归列表 (list x leftChild rightChild)其中leftChild和rightChild列出了自己 我写了以下代码

(define (insert bst x)(
     (cond 
       [(null? bst) (append bst (list x '() '()))]
       [(<= x (car bst)) (insert (cadr bst) x)]
       [else (insert (caddr bst) x)]  
     )))

当我写

(insert (insert null 8) 9)

它给出了一个错误:函数调用:预期一个函数在打开括号后但收到(列表8为空空) 有谁能解释一下?

1 个答案:

答案 0 :(得分:1)

报告的错误发生是因为()表达式周围存在错误的cond对,这使得Scheme尝试在没有的情况下执行过程。但是除此之外还有一些逻辑问题,当插入一个元素时,你实际上并没有构建一个列表,并且缺少一个案例 - 如果该元素已经存在于树中会发生什么?这应该有效:

(define (insert bst x)
  (cond 
    [(null? bst)
     (list x '() '())] ; this is the correct way to handle the base case
    [(= x (car bst))   ; this case was missing
     bst]              ; simply leave the tree as it is
    [(< x (car bst))   ; if this happens, recursively build a list
     (list (car bst) (insert (cadr bst) x) (caddr bst))] 
    [else              ; if this happens, recursively build a list
     (list (car bst) (cadr bst) (insert (caddr bst) x))]))

这是你使用这个程序的方法:

(insert (insert (insert (insert null
                                10)
                        5)
                16)
        13)

=> '(10 (5 () ()) (16 (13 () ()) ()))