【问题标题】: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 为什么是红色的。它不应该是红色的。如果是,则修复代码之前的前导代码不起作用,并且仅在要删除的节点为黑色且没有子节点时调用修复代码。

    【讨论】:

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