删除二叉树中的节点的方法

时间:2014-05-18 13:56:14

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

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

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

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

  1. 在右侧子树(即6)中找到4的继承者
  2. 交换4和6
  3. 从右子树中删除6
  4. 将左子树4(在这种情况下仅为1)附加到新节点6
  5. 因此我们得到了

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

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

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

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

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

      为什么我应该使用我的书而不是我自己的书呢?我的解决方案似乎更容易(至少从我的角度来看)实施,但我更喜欢别人指出我是不是错了。

2 个答案:

答案 0 :(得分:2)

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

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

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

可能只是因为他们没有考虑过你的方法,或者,如果他们有,他们可能会选择他们的方法,因为树的平衡性越差,对它的查询性能越差

虽然这个讨论并不是特别重要,但由于基本的二元搜索树在实践中很少使用 - 而是使用self-balancing ones(由于试图维护某些属性,可以使用更强大的参数)保持树平衡。

答案 1 :(得分:0)

当树木不平衡时,穿越树木的时间会增加,因此您将失去使用BST的一些好处。