C 二叉搜索树中节点的删除

C 二叉搜索树中节点的删除,c,algorithm,tree,C,Algorithm,Tree,我有一个BST,看起来像这样: 我正在尝试删除节点12(它有两个子节点), 我想知道我是否正确地移除了它 搬迁前 12 _/ \_ 5 18 / \ / \ = = 15 19 2 9 / \ 13 17 拆除后: 18 _/ \_ 5 19

我有一个BST,看起来像这样: 我正在尝试删除节点12(它有两个子节点), 我想知道我是否正确地移除了它

搬迁前

          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  

让我们举一个简单的例子

以这棵树为例:

  A
 / \
B   C
要删除,请执行以下操作:

  • 选择B或C作为其替换项,则将此节点升级以取代A
  • 取另一个子节点(B或C)并将其挂接到第一个子节点(B或C)
    • 如果选择B作为A的替换,则需要将C钩住B作为其最左侧的新子节点
    • 如果选择C作为A的替换,则需要将B作为其最右边的新子节点连接到C中
  • “最左边/最右边的子节点”我的意思是,只要在那个方向上有子节点,就需要在左边或右边向下导航,然后当你到达一个没有左边/最右边子节点的节点时(根据你要去的方向),将“另一个节点”作为它在那个方向上的新子节点钩住

    我们先考虑选择B,你会得出这样的结论:

       B
        \
         ...
            \
             C
    
          C
         /
      ...
     /
    B
    
    如果您先选择C,您将得到以下结果:

       B
        \
         ...
            \
             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
    

    两者都可以。可能还有一些关于的信息值得一读。

    二叉搜索树的属性是什么?他们还支持你的新树吗?你应该能自己回答这个问题。我相信他们能回答,但我想确认我为什么要问。二叉搜索树的属性是什么?该树还满足二叉搜索树属性,即每个节点中的键必须大于左子树中存储的所有键,并且比右子树中的所有关键点都小。(叶(最终节点)树的每个部分都不包含键,也没有结构来区分它们。好的,那么18比它的右子树中的所有节点都小吗?嗯,我得到树的方式是,我查看12的右子树,发现值刚好大于12,所以13。然后12变为13,现在我有一个没有子节点的节点13(在底部)因此,我可以自己删除重复项,从而得到这棵树。如果13有一个正确的孩子呢?不管你采取什么方法,你都应该为你的树代码编写单元测试。提出许多树示例,删除哪些节点,然后编写代码来验证树的完整性。无需将确切的方法硬编码到单元测试中t你可以编写一个标准化的测试方法,创建一个列表,列出所有的值,并验证列表是否仍然排序,并且它是否只缺少你删除的节点中的值。然后我将应用一个节点有一个子节点的情况,因此删除底部的重复13,并将点13的父节点删除到正确的子节点?