我似乎无法弄清楚如何从BST中删除元素。这是我的代码
(define remove (lambda (x t)
(if (< x (car t)) (list (car t) (remove x (cadr t)) (caddr t))
(if (> x (car t)) (list (car t) (cadr t) (remove x (caddr t)))
(if (not(and (null? (cadr t)) (null? (caddr t))))
(let ((r (minimum (caddr t)))) ((remove r t) (set-car! t r)))
(list '() (cadr t) (caddr t)))))))
Minimum返回树中的最小值。 如果我尝试删除不是叶子的元素,它会进入无限循环。我该如何解决?
答案 0 :(得分:0)
作为替代方案,您可以在这里查看BST在方案中的整个实现:
它有很好的文档记录,可以让您对构建代码以便于阅读和调试的方式有所了解。特别是,它分别处理叶子和节点(非叶子)移除。
答案 1 :(得分:0)
我认为你最大的问题在于本节:
((remove r t) (set-car! t r))
您要从r
删除t
,但您应该从r
的右子树中删除t
。我不确定你为什么要使用mutable / setting;我认为这很容易成为一个非副作用的东西。我会尝试类似的东西:
(list r (cadr t) (remove r (caddr t)))
我还必须承认,我对你最后一行的意图有点困惑。你在用什么空列表?