二叉搜索树中节点的去除

时间:2015-11-29 16:23:49

标签: c algorithm tree

我有一个看起来像这样的BST: 我试图删除节点12(有2个孩子), 我想知道我是否正确删除了它?

删除前

          12
        _/   \_
     5          18
  /     \     /     \
 =       =   15     19
 2       9   /  \     
            13   17  

删除后:

          18
        _/   \_
     5          19
  /     \     /    
 =       =   15     
 2       9   /  \     
            13   17  

我的实施在这里是否正确? 感谢。

删除后编辑更新:

          13
        _/   \_
     5          18
  /     \     /    \
 =       =   15     19
 2       9     \     
                17  

1 个答案:

答案 0 :(得分:0)

我们举一个简单的例子。

考虑这棵树:

  A
 / \
B   C

要删除A,请执行以下操作:

  1. 选择B或C替换它,将此节点提升为A。
  2. 取另一个子节点(B或C)并将其挂钩到第一个(B或C)
    • 如果您选择B作为A的替代品,则需要将C挂钩到B作为其最新的最左侧子节点
    • 如果您选择C作为A的替代品,则需要将B挂钩到C作为其最新的最右侧子节点
  3. “左/右子节点”我的意思是你需要向左或向右向下导航,只要你有那个方向的子节点,然后你来到一个没有左/右子节点的节点(根据你去哪个方向),将“其他节点”挂钩到它作为该方向的新子节点。

    让我们先考虑选择B,你最终会得到这个:

       B
        \
         ...
            \
             C
    

    如果你先选择C,你最终会得到这个:

          C
         /
      ...
     /
    B
    

    回到你的树上,它开始于:

            12
          /    \
         5      18
        / \    /  \
       2   9  15   19
             /  \
            13   17
    

    要删除12,并选择18替换它,首先要提升18:

         5      18
        / \    /  \
       2   9  15   19
             /  \
            13   17
    

    然后,由于18在前一个例子中对应于C,你需要将5个钩子连接到18作为最左边的子树,给你最后一棵树:

            18
           /  \
          15   19
         /  \
        13   17
       /
      5
     / \
    2   9
    

    让我们来看看如果我们选择5代替12代替会发生什么:

    宣传5:

         5      18
        / \    /  \
       2   9  15   19
             /  \
            13   17
    

    然后将18连接到5作为其最右边的子树:

        5
       / \
      2   9
           \
            18
           /  \
          15   19
         /  \
        13   17
    

    要么没事。关于Wikipedia page的更多信息可能值得一读。