【问题标题】:Something strange about Red-Black Tree Delete in Introduction to Algorithms算法导论中关于红黑树删除的一些奇怪的事情
【发布时间】:2015-08-21 09:11:09
【问题描述】:
在Introduction to Algorithms 3rd edition,第329页,图13.7向我们展示了4个删除案例。
(来源:quoracdn.net)
但是我有一个问题:在那个图中,x 的所有节点都是黑色的,它不是零。但是我测试了很多情况,结果x必须是RED节点或者nil,原因是:
如果 z 的子节点少于 2 个,则 x 必须是 RED 节点或 nil,因为 z 的黑色高度必须为 1。
如果 z 有 2 个子节点,x 必须是 RED 节点或 nil,因为 y 是 z 的后继节点且 y 的左子节点必须为 nil,则 y 的黑色高度必须为 1。
我错了吗?还是有什么我忽略的?希望有人可以帮助我。
感谢您的宝贵时间。
【问题讨论】:
标签:
algorithm
data-structures
binary-search-tree
red-black-tree
【解决方案1】:
什么是z? 4个案例中的任何一个都没有标记。你的意思是 w 是兄弟节点吗?
在我看来,x 要么为 null(这是有效的,你刚刚删除了它)要么是黑色的并且你删除的节点在 x 的左子树或 x 的右子树的更下方。
还要注意,在调用 FIXUP 例程之前,会调用各种其他情况。
如果要删除的节点有 0 个子节点并且是红色 => 只需删除它。它是一个叶节点。它仍然是一棵红黑树。
如果要删除的节点有 1 个子节点 => 节点为黑色,子节点为红色。由于它们违反了红黑树规则,因此不会出现其他可能性。删除节点并替换为子节点。孩子现在是黑色的。它仍然是一棵红黑树。
如果要删除的节点有 2 个子节点 => 找到中序的 Successor 或 Predecessor。交换要删除的节点但不是颜色。有序的 Successor 或 Predecessor 将始终是具有 0 或 1 个子节点的节点。现在您只需要删除减少到上述两种情况的内容。
那么还剩下什么要做呢?
难点:0个孩子,节点为黑色。
在上图中,案例 2 是起始案例,左右兄弟的孩子都是 nil。 x 不再存在,但 w 存在并且是黑色的
在我看来,您需要在代码中找出 x 为什么是红色的。它不应该是红色的。如果是,则修复代码之前的前导代码不起作用,并且仅在要删除的节点为黑色且没有子节点时调用修复代码。