【问题标题】:Ways to delete a node in a binary tree二叉树中删除节点的方法
【发布时间】:2014-05-18 13:56:14
【问题描述】:

我正在关注一本书,它解释了如何从二叉搜索树中删除节点,基本上如果我们有这棵树:

       10
      /  \
     4    100
    / \
   1   8
      / \
     6   9
      \
       7

我们要删除节点 4,书上说我应该:

  1. 在其右子树(即 6)中查找 4 的后继者
  2. 交换 4 和 6
  3. 从右子树中删除 6
  4. 将 4 的左子树(本例中为 1)附加到新节点 6

因此我们得到

       10
      /  \
     6    100
    / \
   1   8
      / \
     7   9

但是我想到了另一种方法:

  1. 找到 4 个右子树的最小元素(即 6)
  2. 将 4 的左子树附加到 6(它不会有左子树)
  3. 将父元素 (10) 附加到 4 的右侧元素 (8)。如果算法是递归的,我们可以返回 8

因此我们得到

       10
      /  \
     8    100
    / \
   6   9
  / \
 1   7

现在我想问一下:我看到我的解决方案(至少在这种情况下)产生了一个稍微不平衡的树。

我有理由使用我的书而不是我自己的吗? 似乎我的解决方案更容易实施(至少从我的角度来看),但我更喜欢其他人指出我是否弄错了。

【问题讨论】:

    标签: algorithm binary-tree binary-search-tree


    【解决方案1】:

    这两种方法的代码都不是特别复杂。

    您的方法通常会产生一个不太平衡的树,因为您正在获取一个子树(1 的子树)并将它(可能)移到树的很远的地方。

    通过他们的方法,7 的子树向上移动 1 个节点,其他子树不会移动。

    这可能只是因为他们没有考虑您的方法,或者如果他们考虑了,他们可能会选择他们的方法,因为树的平衡越差,查询的性能就越差。

    虽然这个讨论不是特别重要,因为基本的二叉搜索树在实践中很少使用 - 而是使用 self-balancing ones平衡)。

    【讨论】:

    • 我知道自平衡树,它们是这一章之后的一章。但我想在转到下一个主题之前先弄清楚一个主题;)
    【解决方案2】:

    当你的树不平衡时,遍历树的时间会增加,因此你会失去使用 BST 的一些好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多