红黑树的删除算法

Posted

技术标签:

【中文标题】红黑树的删除算法【英文标题】: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 具有三种颜色(既不是黑色也不是红色)或其他颜色?

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

您可以参考以下代码。

http://code.google.com/p/cstl/source/browse/src/c_rb.c

【讨论】:

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

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

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

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

【讨论】:

以上是关于红黑树的删除算法的主要内容,如果未能解决你的问题,请参考以下文章

红黑树的删除算法

红黑树之 原理和算法详细介绍

红黑树之 原理和算法详细介绍

红黑树- 原理和算法详细介绍

算法 红黑树之 原理和算法详细介绍

红黑树之 原理和算法详细介绍---转帖