我正在阅读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>
我错过了什么?
我发现维基百科对插入有很好的解释,但删除的解释令人困惑。
答案 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”,我们看到这是一个根,所以我们完成了!树是平衡的!