【问题标题】:Red black tree deletion unknown behaviour红黑树删除未知行为
【发布时间】:2019-05-08 23:14:50
【问题描述】:

我在红黑树中输入了几个数字。 (41;38;31; 12; 19; 8)删除8和12(第一个屏幕截图)后,它进入了第二个屏幕截图的类型。我不明白为什么 31 变成红色。请帮帮我?如果您可以请提及与此相关的案例。 谢谢!

【问题讨论】:

  • 你了解红黑树的定义吗?如果0031 节点仍然是黑色的,那么这棵树还会满足约束吗? (答案:不。)为什么不呢?

标签: algorithm data-structures tree red-black-tree tree-balancing


【解决方案1】:

如果您查看Wikipedia 上对删除算法的说明,您可以将它们的节点命名映射到您的树,如下所示:

M = 0012,要移除的黑色节点
C = 0012 以下的 NIL 叶(NIL 始终被视为黑色)

文章继续讲述您的实际案例:

复杂的情况是MC都是黑色的。 [...] 我们首先将 M 替换为其子 C。 [...] 我们将重新标记这个孩子 C(在它的新位置)N,以及它的兄弟姐妹(它的新父母的另一个孩子) S [...] 我们还将使用 P 作为 N 的新父母 SL 表示 S 的左孩子,SR 表示 S 的右孩子

所以现在我们在移除之后,但在重新着色之前:

P = 0019(红色)
N = NIL 叶子,0019 的左子节点
S = 0031 , 0019的右孩子

描述标识了几种情况,手头的情况如下:

案例4:SS的孩子是黑色的,而P是红色的。在这种情况下,我们只需交换 SP 的颜色。

解释了这种颜色交换的原因:

这不会影响经过 S 的路径上的黑色节点数,但它会在经过 N 的路径上的黑色节点数上加一,使得为这些路径上已删除的黑色节点做好准备。

回想一下,在红黑树中,这个不变量必须保持 (property 5):

从给定节点到其任何后代 NIL 节点的每条路径都包含相同数量的黑色节点。

如果省略上述颜色交换,则将违反此不变量。

【讨论】:

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