Scheme bst-delete-max

时间:2015-11-02 03:16:39

标签: list tree scheme binary-tree binary-search-tree

我必须创建一个函数bst-delete-max,它将二叉搜索树作为参数,并返回一个二叉搜索树,其中包含从树中删除的最大值的节点。我不能使用任何找到最大值(bst-max)的辅助函数或一个帮助函数来删除节点(bst-delete)。因此,我完全迷失了如何处理这个问题以及如何为它做任何事情。我知道无论我在哪里使用过bst-max,我都必须编写函数来找到最大的最大值。但是我该如何删除呢?任何帮助将不胜感激。这就是我到目前为止所拥有的:

 (define (remove-max bs-tree)
  (cond ((null? bs-tree)
     '())
    ((null? (bst-right bs-tree))
     (bst-value bs-tree)
     (car bs-tree)) ;This is the part I know is wrong. How should I fix it?
    (else (remove-max (bst-right bs-tree)))))

1 个答案:

答案 0 :(得分:2)

消除BST中的最大元素有两种可能:节点是叶子(在这种情况下我们必须返回null)或者节点有一个左子树(然后我们必须返回它,因为我们只需要消除单个节点,而不是整个子树。

请注意,节点不能有正确的子树,否则它不会是最大元素。我们可以通过简单地返回左子树来覆盖所有情况,无论是什么 - 如果我们在叶子中,它甚至可能是null。此外,我们必须在推进时建立一个新的树,使用相同的元素 - 只有正确的子树才会不同。

假设我们有一个bst-make过程接收一个值,一个左子树和一个右子树作为参数,这就是一个可能的解决方案的样子:

(define (remove-max bs-tree)
  (cond ((null? bs-tree)
         '())
        ((null? (bst-right bs-tree))
         (bst-left bs-tree))
        (else
         (bst-make (bst-value bs-tree)
                   (bst-left  bs-tree)                   
                   (remove-max (bst-right bs-tree))))))