从方案中的BST中删除元素

时间:2010-12-11 15:03:27

标签: scheme binary-tree

我似乎无法弄清楚如何从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返回树中的最小值。 如果我尝试删除不是叶子的元素,它会进入无限循环。我该如何解决?

2 个答案:

答案 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)))

我还必须承认,我对你最后一行的意图有点困惑。你在用什么空列表?