从完全黑色的红黑树中删除节点

时间:2013-12-28 01:43:46

标签: algorithm data-structures binary-search-tree red-black-tree

我正在阅读Wikipedia explanation of red black tree removal process

有一件我无法理解的简单事情。

示例:我有一个完全黑色的RBTree

                     3(B)
                 /          \
                /            \
               1(B)          5(B)
             /     \        /    \
            /       \      /      \
           0(B)     2(B) 4(B)     6(B)

维基百科指出,如果你有一个节点要删除2个叶子节点,而兄弟节点也是一个有2个叶子节点的节点,那么我们可以简单地删除节点并重新着色父节点和兄弟节点。

假设在上面的树中我想要删除0.然后没有任何重新着色的1或2会有所帮助,因为无论你做什么,两个子树(1面)和5面最终会有不同的黑色高度。 / p>

我错过了什么?

我发现维基百科对插入有很好的解释,但删除的解释令人困惑。

1 个答案:

答案 0 :(得分:2)

在树中删除节点“0”实际上是最复杂的情​​况。让我们一步一步地遵循description from wikipedia

  

我们使用标签M来表示要删除的节点; C表示a   M的选定孩子,我们也称之为“它的孩子”。如果M确实如此   有一个非叶儿,叫它的孩子,C;否则,选择   叶子作为它的孩子,C。

因此,在这种情况下,M是您的节点“0”,将被删除,C是其任何NIL子节点(叶子,总是NIL)。只是提醒一下,你的原始树 - 遵循你美丽的ascii艺术是:

                     3(B)
                 /          \
                /            \
               1(B)          5(B)
             /     \        /    \
            /       \      /      \
           0(B)     2(B) 4(B)     6(B)

所以M是“0”,并注意这里没有绘制C(NIL叶子)。维基百科如下:

  

复杂的情况是M和C都是黑色(这是我们的情况) ....在图表中   在下面,我们还将使用P代表N的新父母(M的老父母),SL代表   S是左孩子,SR是S的右孩子。

因此,P为“1”,S为“2”,所有节点均为黑色。然后你按照案例描述。你跳过案例1,因为“0”不是root。你跳过案例2,因为“2”不是红色。案例3匹配:

  

案例3: P,S和S的孩子都是黑人。在这种情况下,我们只是重新绘制S红色。结果是所有路径都经过S,其中   正是那些不经过N的路径,少了一个黑色   节点。因为删除N的原始父级使所有路径都通过   通过N有一个较少的黑色节点,这使事情变得平坦。但是,所有   通过P的路径现在比没有路径的路径少一个黑色节点   通过P,所以属性5(从任何给定节点到其的所有路径)   仍然违反了叶子节点包含相同数量的黑色节点。   为了纠正这个问题,我们在P上开始重新平衡过程   在案例1中。

此时,您删除“0”,并重新绘制S =“2”红色:

                     3(B)
                 /          \
                /            \
               1(B)          5(B)
                   \        /    \
                    \      /      \
                    2(R) 4(B)     6(B)

然后,按照描述,你转到案例1,但是这次将其父节点P(=“1”)替换为N.但是N =“1”不是root,所以你跳转到案例2。 S =“5”不是红色,所以我们再次跳到案例3。在这里,我们重新绘制S =“5”红色:

                     3(B)
                 /          \
                /            \
               1(B)          5(R)
                   \        /    \
                    \      /      \
                    2(R) 4(B)     6(B)

然后我们必须再次跳到案例1,这次P =“3”替换为N. N =“3”,我们看到这是一个根,所以我们完成了!树是平衡的!