在“算法导论”第3版,第329页中,图13.7显示了4个删除案例。
http://qph.is.quoracdn.net/main-qimg-ad5e030dca260dcaf853e658f8555dd3?convert_to_webp=true
但是我遇到了一个问题:在那个图中,x
的所有节点都是黑色的,并且它不是零。但我已经测试了很多案例,结果证明x
必须是RED节点或nil,原因如下:
如果z的子项少于2个,那么x必须是RED节点或nil,因为z的黑色高度必须为1.
如果z有2个子节点,则x必须是RED节点或nil,因为y是z的后继节点,y的左子节点必须为nil,则y的黑色高度必须为1.
我错了吗?还是有什么我忽略的?希望有人可以帮助我。
感谢您的时间。
答案 0 :(得分:0)
z是什么?这4种情况均未标记。你的意思是兄弟姐妹节点吗?
在我看来,x要么为空(并且是有效的,您刚刚删除了它),要么为黑色,并且您删除的节点在x的左子树或x的右子树的下方。
还要注意,在调用FIXUP例程之前,还会调用其他各种情况。 如果要删除的节点有0个子节点并且是Red =>,则将其删除。它是一个叶节点。它仍然是一棵红黑的树。 如果要删除的节点有1个子节点=>节点为黑色,子节点为红色。因为它们违反了红黑树规则,所以没有其他可能性发生。删除该节点,并替换为子节点。孩子现在是黑人。它仍然是一棵红黑树。 如果要删除的节点有2个子节点=>查找顺序的后继者或前任者。交换要删除的节点但不要使用颜色。顺序的后继者或前任者将始终是具有0或1个子代的节点。现在,您只需要删除减少到上述2种情况的内容即可。 那还剩下什么呢? 困难的情况:0个子节点,节点为Black。
在上图中,情况2是开始情况,兄弟姐妹的左右孩子均为零。 x不再存在,但是w确实是黑色
在我看来,您需要在代码中找出x为何为红色的原因。它永远不应该是红色的。如果是,则修复代码之前的前导代码不起作用,并且仅当要删除的节点为黑色且没有子节点时才调用修复代码。