【问题标题】:Deletion algorithm for a Red Black tree红黑树的删除算法
【发布时间】:2011-03-27 23:23:05
【问题描述】:

伙计们,我正在尝试为红黑树实现删除算法,但我在理解该算法的第三行时遇到问题(来自“算法简介”第二版一书):

1 如果 left[z] = nil[T] 或 right[z] = nil[T]
2 然后 y ← z
3 else y ← TREE-SUCCESSOR(z)
4 如果 left[y] ≠ nil[T]
5 然后 x ← 左[y]
6 else x ← right[y]
7 p[x] ← p[y]
8 如果 p[y] = nil[T]
9 然后根[T] ← x
10 else if y = left[p[y]]
11 然后左[p[y]] ← x
12 否则对[p[y]] ← x
13 如果 y 3≠ z
14 然后键[z] ← 键[y]
15 将y的卫星数据复制到z
16 如果颜色[y] = 黑色
17 然后 RB-DELETE-FIXUP(T, x)
18返回y

首先,这本书中没有任何地方解释了 TREE-SUCCESSOR 应该是什么样子(没有算法),但我找到了this page:如果我用 11、2、1、7 输入这个算法,5,8,14,15,4 然后尝试删除 7 它会找到 predecessor 但如果我尝试删除 11 它会找到 successor。那是我无法理解的。为什么有时需要前任,有时需要继任者?做出此决定时考虑了哪些标准?节点的颜色?
谢谢。

附:我也不太明白第 13 行写了什么。这是否意味着如果 y 具有三种颜色(既不是黑色也不是红色)或其他颜色?

【问题讨论】:

    标签: red-black-tree


    【解决方案1】:

    树后继树(与树前驱树相反[我相信在那本书中])通常为二叉搜索树定义为具有下一个最高键的节点。它如何确定它取决于类型(在这种情况下为红黑色),我几乎肯定你的书将后继方法留作练习。 (我记得这个问题:P)

    【讨论】:

    • 感谢您的回答,但我在本书中找不到任何关于 TREE-SUCCESSOR 的信息。那么为什么在我提供链接的网络上有时会选择前任,有时会选择继任者?有什么理由吗?
    • 您使用的网站会在页面的最底部记录为什么会发生这种情况。这是他们设计删除算法的方式。你书中的算法看起来好像总是选择继任者。就是再平衡的问题,只要符合红黑规则都可以留给算法设计者。
    • 是的,这是从网站上获取的:这个删除算法可以使用后继或前任。决定如下:如果是红色或不是黑色叶子(即它可以是黑色和红色叶子),则使用后继;否则使用前任。无论使用前任还是继任者,在上述描述中都称为后继者。
    【解决方案2】:

    【讨论】:

    • 有没有第三版而不是第二版的例子。我的算法不能轻易容忍内容复制,CLRS 3rd edition 使用了更有吸引力的算法。
    【解决方案3】:

    我认为您正在阅读 CLRS 第 2 版。

    TREE-SUCCESSOR 在第 12 章第 2 节 - “12.2 查询二叉搜索树”中介绍。与 Jesse Naugher 所说的相反,它不依赖于二叉搜索树的类型。

    您引用的第 13 行是一个错字。它应该是“如果 y != z”。

    【讨论】:

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