【问题标题】:Binary search tree deletion operation二叉搜索树删除操作
【发布时间】:2013-01-01 14:24:00
【问题描述】:

我有一本书以一种非常糟糕的方式解释了所有的二叉搜索树,到目前为止,我能够仔细研究我的书并了解二叉搜索树,但是我找到了二叉搜索树的解释操作Delete

前两个简单的操作我确实懂:

  • 删除叶子(没有子节点的节点):删除叶子很容易,因为 我们可以简单地将其从树中移除。
  • 删除具有一个子节点的节点:删除节点并将其替换为 它的孩子。

然而,有两个孩子的那个对我来说真的很难理解,我已经在 wiki 和其他网站上阅读并尝试找到解决方案,但我发现解释有点加密。

我希望这里有人可以给我更多细节或以另一种方式向我解释?

【问题讨论】:

  • 为什么会有java标签?
  • @ManishMulani Studying Java 但是我可以看到这并不是专门指 Java
  • @KatjaChristiansen 是的,它有帮助,但是我对 wiki 上的有序原则感到非常困惑,它说它从左子树开始,但是这个人告诉我从右子树中获取节点=跨度>
  • 尝试谷歌搜索,如果你不明白可以放一些代码

标签: data-structures binary-tree binary-search-tree


【解决方案1】:

如果你理解了前两条规则,那么删除一个有两个孩子的节点就不难理解了。

一个很简单的想法是,去要删除的节点的有序后继(或前驱)。然后再次应用前两条规则和前一条规则。

在编程时,拥有一个功能齐全的后继(前任)函数可以让编码删除变得简单很多。

对于这棵树:

删除 8 :

  • 转到 9 (7)

  • 将 9 替换为 10

  • 将 8 替换为 9 (7)

删除 12 :

  • 转到 14 (10)

  • (将 9 替换为 10)

  • 将 12 替换为 14 (10)

【讨论】:

    【解决方案2】:

    我们可以简单地说:

    要在二叉树中删除一个有 2 个子节点的节点 N(如前面提到的),要么用左子树的最大节点或右子树的最小节点替换这个 N

    【讨论】:

      【解决方案3】:

      当节点有两个孩子时,你必须:

      1. 找到最小值。
      2. 将要删除的节点的key替换为最小元素。

      看这张图: 我们要删除元素 4

      • 4 有 2 个孩子。

      • 找到最小的右子树。

      • 找到 5 个。

      • 所以,4被5替换,4被删除。

      希望这就是你要找的!

      【讨论】:

        猜你喜欢
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多