【问题标题】:Removing node from a totally black red black tree从完全黑红黑树中删除节点
【发布时间】: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


【解决方案1】:

删除树中的节点“0”实际上是最复杂的情​​况。跟着description from wikipedia一步步来吧:

我们用标签M来表示要删除的节点; C 将表示一个 M 的选定子节点,我们也将其称为“它的子节点”。如果 M 有 有一个非叶孩子,称其为孩子,C;否则,选择 任一个叶子作为它的孩子,C。

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

                     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”不是根。您跳过案例 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" 不是根节点,因此您跳转到案例 2。 S = "5" 不是红色的,所以我们再次跳转到案例 3。在这里,我们将 S = "5" 重新绘制成红色:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 2016-08-03
    • 2021-01-03
    • 2014-07-05
    • 1970-01-01
    • 2015-11-17
    • 2011-09-18
    • 2021-10-17
    相关资源
    最近更新 更多