算法和数据结构

红黑树专题

2017-12-10  本文已影响64人  王侦

0.目录

相关总结参见:http://www.jianshu.com/p/bdd7442f54e2

1.算法导论的红黑树本质上是2-3-4树

1.1 2-3-4树的定义

一棵2-3-4树是一棵完美平衡的2-3-4查找树。

2-3-4树优良的平衡性
关键的属性:所有从根到叶子(NULL节点)的距离是一样长


树高:

直接实现2-3-4树是复杂的,使用红黑树代替实现。

1.2 2-3-4树的操作

1.2.1 查找

1.2.2 插入

有两种方法(对应第三、第四两节):

1.2.2.1 自底向上插入

如果是在4节点中进行插入,每次插入会多出一个分支,如果插入操作导致根节点分裂,则2-3-4树会生长一层。




1.2.2.2 自顶向下插入

核心是保证当前结点不是4-结点。
有两个结果:

分裂四结点的方法:
因为不会出现上下两个连续的4-结点,因此4-结点只可能出现在2-结点或者3-结点下面:

另一个例子






1.2.3 删除


任何一个结点的删除,都可以归结为后继结点(一个叶子节点,一定是一个叶子节点,否则在该节点临近的右分支树上还有更小的数)的删除:

1.2.3.1 自底向上删除

如果是在2节点(叶子节点)中进行删除,每次删除会减少一个分支,如果删除操作导致根节点参与合并,则2-3-4树会降低一层。(只有重复step3.2.3,直至根节点,才会发生根的高度减小一层,如下图所示示例)






1.2.3.2 自顶向下删除

自顶向下删除时,保证当前结点不是2-结点(除根节点,因为根节点没有兄弟节点和父节点)。
遇到当前节点是2节点,如果兄弟节点也是2节点就合并(该节点的父节点中的key下移,与自身和兄弟节点合并);如果兄弟节点不是2节点,则父节点的key下移,兄弟节点中的key上移。这样可以保证,找到需要删除的key所在的节点时可以直接删除(即要删除的key所在的节点一定不是2节点)。

如下示例中,如果删除根节点50怎么办?
方法同自底向上删除一样,用后继55代替50,然后转换为删除55。即同样转换为删除叶子节点,然后自顶向下保证当前结点不为2-结点。



这里包含key为60的节点也可以选择让父节点中的key 76下移和兄弟节点中的83合并,两种方式都能达到B树的平衡,这也是在2-3-4树对应的红黑树中使用的方式。




1.2.4 红黑树与2-3-4树的等价性


2.红黑树的结构和性质

红黑树是一颗二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或black。
通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长处2倍,因而近似于平衡的。

结点属性:color key left right p
可以把NIL视为二叉搜索树的叶节点的指针,而把带关键字的结点视为树的内部结点。

一棵红黑树是满足下面红黑性质的二叉搜索树:

3.红黑树的插入

插入的要求:保持2-3-4树完全平衡,即根到所有的叶子(NULL结点)的距离完全相等,因此必须要求插入的是红色结点。且2-3-4树只能向上增长。(因此必须保证当前结点不是4-结点)
另外4-结点的形式如下:



以下形式不允许:


1)插入2-结点下面,直接插入(红色),变成3-结点


2)插入3-结点下面,直接插入(红色),变成4-结点

3)插入4-结点下面,需要对4-结点进行分裂

对于4-结点进行分裂,会让孩子结点的元素插入到父节点,如果父节点此时是4-结点,则会导致又一次分裂,因此针对这种情况,有两种处理方法:

3.1 自底向上的插入(与1.2.2.1 完全平衡树2-3-4树的自底向上插入一一对应)

将新元素插入到红黑树的底部(作为叶子),并标记为红色。
因此只可能违反性质2或性质4,然后自底向上调整红黑树以修复性质,z和z.p都是红色(主要是性质4,性质2可以通过重新着色完成修复):

3.2 自顶向下的插入(与1.2.2.2 完全平衡树2-3-4树的自顶向下插入一一对应)

插入的结点还是插入在叶子上,且颜色还为红色,但是保证新插入结点的父节点为黑色,所以在向下的路径中,需要做一些调整(只有一个调整):

例子如下:

4.红黑树的删除


任何一个结点的删除,都可以归结为后继结点(一个叶子节点,一定是一个叶子节点,否则在该节点临近的右分支树上还有更小的数)的删除:

删除的要求:保持2-3-4树完全平衡,即根到所有的叶子(NULL结点)的距离完全相等,因此自顶向下设法保证删除的是红色结点(也即保证当前结点不是2-结点)。
1)从叶子4-结点中删除,直接删除,变成3-结点


2)从叶子3-结点中删除,直接删除,变成2-结点

3)从叶子2-结点中删除,需要转换成3-结点或4-结点进行删除(具体参见1.2.3.1 自底向上删除)

4.1 自底向上的删除

4.1.1 一个重要结论:如果一个红黑树结点只有一个儿子,或者没有儿子,则一定是对应2-3-4树叶子节点

4.1.2 自底向上删除分为如下四种情况,对这四种情况进行分析(情况1和2可以算作一种,本身z就是对应2-3-4树叶子节点;情况3和4可以算作一种,都是找后继y(对应2-3-4树叶子节点))


总结:
情况1和2——删除的都是叶子节点上的值,此时z和y相同,但是此叶子是2-结点和3-结点两种情况,对于另一种4-结点情况的删除,包含在情况3中
情况3和4——本质上都是一样的,寻找z的后继y来代替z,然后删除y;删除y已经是叶子,转换为情况1和2和情况3的叶子删除情况



z——删除的真实结点
y——最后都归结为对结点y的删除:y是被转换为叶子节点中要删除的结点,如果z本身是叶子节点,则y=z;否则y是z的后继
x——x和y同属于一个叶子结点

总结:


(重要)对后面的四种情况进行总结:

当x是黑色时,分为以下四种情况进行调整:
关键思想是在每种情况中,从子树的根(包括根)到每棵子树αβγδεζ之间的黑结点个数(包括x的额外黑色)并不被变换改变。

4.2 自顶向下的删除

核心思路:将删除归结为删除一片红叶子。(保证删除的不是2-结点)
总是可以归结为一个2-3-4树叶子节点中关键字的删除:

保证删除的不是2-结点?
遇到当前节点是2节点,如果兄弟节点也是2节点就合并(该节点的父节点中的key下移,与自身和兄弟节点合并);如果兄弟节点不是2节点,则父节点的key下移,兄弟节点中的key上移。这样可以保证,找到需要删除的key所在的节点时可以直接删除(即要删除的key所在的节点一定不是2节点)。
这里可以确定:向下搜索的路径上,当前结点的父节点一定3-结点和4-结点。

(重要)对下面情况的总结:

《数据结构与算法分析》给出的类似方法:
怎样确保从上到下查找期间树叶是红的?
假设当前结点为X,T是其兄弟,P是其父亲

实例

删除结点10
删除结点10
删除根节点15

证明:为什么各种情况下通过相应的旋转和重新着色可以使得满足红黑树性质?
证明:确保旋转和着色后保证红黑树各条性质都满足(特别是性质4和5:不能有连续的两个红结点,以及结点到所有叶子节点的黑色结点个数是相等)

5.基于2-3-4树的左倾红黑树

6.Sedgewick改进的一种更简单的红黑树——基于2-3树的左倾红黑树

上一篇 下一篇

猜你喜欢

热点阅读