我正在尝试在球拍中实现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为空空) 有谁能解释一下?
答案 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 () ()) ()))