【问题标题】:Scheme bst-delete-max方案 bst-delete-max
【发布时间】:2015-11-02 03:16:39
【问题描述】:

我必须创建一个函数 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)))))

【问题讨论】:

  • 我真的需要一些帮助。有人吗?

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


【解决方案1】:

消除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))))))

【讨论】:

  • 我明白你在说什么。我真的不明白你发布的代码。我想我之前尝试过类似的东西,但没有奏效。我试图对此进行测试,但得到的结果与我的其他代码相同:()。为什么会这样?
  • @Anon 您忘记在消除节点后递归重建树,请参阅上面的更新。
  • 这更有意义!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多