我在红黑树上输入了几个数字。 (41; 38; 31; 12; 19; 8)删除8和12(第一个屏幕截图)后,进入第二个屏幕截图的类型。我不明白为什么31号变成红色。请帮我吗?如果可以的话,请提及与此有关的案件。 谢谢!
答案 0 :(得分:0)
如果您在Wikipedia上查看了删除算法的说明,则可以将其节点命名映射到树上,如下所示:
M = 0012,要删除的黑色节点
C =低于0012的NIL叶子(始终将NIL视为黑色)
本文继续介绍您的实际情况:
复杂的情况是 M 和 C 均为黑色。 [...]我们首先将 M 替换为其子元素 C 。 [...]我们将重新标记这个孩子 C (在新位置) N ,及其兄弟姐妹(其新父母的另一个孩子) S [...]我们还将对 N 的新父级 S L P > 用于 S 的左子,而 S R 用于 S 的右子< / p>
因此,现在我们已经在移除之后,但在重新着色之前:
P = 0019(红色)
N =一个NIL叶子,左子元素为0019
S = 0031,0019的右子对象
此说明标识了几种情况,其中的情况如下:
情况4:S 和 S 的孩子是黑色的,而 P 是红色的。在这种情况下,我们只需交换 S 和 P 的颜色。
解释这种颜色交换的原因:
这不会影响通过 S 的路径上的黑色节点的数量,但会确实将通过 N 的路径上的黑色节点的数量增加1,查找这些路径上已删除的黑色节点。
回想一下,在红黑树中必须保持不变(property 5):
从给定节点到其后代NIL节点的每条路径都包含相同数量的黑色节点。
如果省略了上面的颜色交换,则将违反该不变式。