Scheme 从方案中的BST中删除元素

Scheme 从方案中的BST中删除元素,scheme,binary-tree,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? (cad

我似乎不知道如何从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)))))))
最小值返回树中的最小值。
如果我试图删除一个不是叶子的元素,它将进入一个无限循环。如何修复它?

作为替代方案,您可以在此处查看BST在scheme中的整个实现:


它有很好的文档记录,可以让您了解如何构造代码,使其易于阅读和调试。特别是,它分别处理叶和节点非叶删除。

我认为您最大的问题在于这一部分:

((remove r t) (set-car! t r))
您正在从t中删除r,但实际上应该从t的右子树中删除r。我也不知道为什么要使用可变性/设置;我认为这会使事情复杂化,因为这很容易成为一个无副作用的函数。我想尝试一下:

(list r (cadr t) (remove r (caddr t)))

我还得承认,我对你最后一行的意图有点困惑。您使用空列表的目的是什么?

谢谢,我会调查一下,但我真的很想听听您对我的代码不起作用的原因有何见解。这有点令人沮丧,尤其是我刚刚开始学习Scheme。同意-也许我想说的是:尝试将代码划分为工作更简单的函数,以便测试它们是否正确工作。这与他们在我链接的页面上所做的类似-您不必像他们那样做,但可以将其分为BST remove,称为BST leaf remove和BST node remove。这有助于它理解代码,然后找到问题所在,因为这样做要容易得多。请澄清,从t中删除r而不是它的正确子树可能是导致无限递归的原因。看起来像是的重复。