【发布时间】:2014-01-15 14:28:01
【问题描述】:
我正在阅读Wikipedia explanation of red black tree removal process。
有一件简单的事情我无法理解。
示例:我有一个完全黑色的 RBTree
3(B)
/ \
/ \
1(B) 5(B)
/ \ / \
/ \ / \
0(B) 2(B) 4(B) 6(B)
Wikipedia 指出,如果您有一个要删除的具有 2 个叶子子节点的节点,并且兄弟节点也是具有 2 个叶子子节点的节点,那么我们可以简单地删除该节点并重新着色父节点和兄弟节点。
假设我想在上面的树中删除 0。那么重新着色 1 或 2 无济于事,因为无论你做什么,两个子树(1 侧)和 5 侧最终都会有不同的黑色高度。
我错过了什么?
我发现维基百科对插入有很好的解释,但删除的解释很混乱。
【问题讨论】:
-
"Wikipedia 指出,如果您有一个要删除的具有 2 个叶子子节点的节点,并且兄弟节点也是具有 2 个叶子子节点的节点,那么我们可以简单地删除该节点并重新着色父节点和兄弟节点。" - 我在文章中没有看到。这在我看来就像在移除下覆盖,M 和 C 都是黑色的,案例 3。在 移除 下查找粗体 案例 3。
-
在这种情况下,文章说要删除节点,将其兄弟节点重新涂成红色,然后重新平衡父节点。
-
因此,根据案例 3,我们将节点 2 重新着色为红色,然后从案例 1 重试。在这种情况下......案例 1 不会做任何事情,但案例 2 会旋转树,使 2 3 的孩子,然后 1R 将成为 2 的孩子,最后 0B 将成为 1 的孩子。现在如果我们删除 0,左侧树的 b 高度仍然是 3,而右侧是 4。跨度>
-
你能解释一下上面的简单案例吗?我无法破译维基百科的答案。
-
你几乎明白了,但是你犯了一个错误,跳到案例 2 - 你应该再次跳到案例 3,然后再跳到案例 1 并完成。看我的回答:-)
标签: algorithm data-structures binary-search-tree red-black-tree