红黑树

来源:互联网 发布:阿里云储存空间不足 编辑:程序博客网 时间:2024/06/05 20:02

一,什么是红黑树?

红黑树是一颗追求局部平衡的二叉查找树,红黑树的每个节点上都有存储位表示节点的颜色。


二,红黑树的性质

1,每个节点是黑色或者红色。

2,根节点是黑色。

3,每个叶子节点(NIL)是黑色。(注意:这里的叶子节点是为NULL的叶子节点)

4,如果一个节点是红色的,它的孩子节点必须是黑色。

5,从一个节点到该节点的叶子节点的所有路径上,包含相同数目的黑色节点。性质5确保没有一条路径比其他路径长出2倍,因而,红黑树是追求局部平衡的二叉树。



三,与红黑树相关的定理

一颗含有n个节点的红黑树的高度做多为2log(n + 1)。


四,红黑树的插入操作

(1),将红黑树当做一颗二叉查找树,将节点插入。

(2),将插入的节点标记为红色。将插入的节点标记为红色,此时唯一可能违背的是性质4。违背的性质越少,要处理的情况就越少,因此把节点标记为红色。

(3),通过一系列的旋转或着色操作,使之重新成为一颗红黑树。

可以根据插入节点的父节点的情况,可以划分下面三种情况来处理。

情况一:插入的节点作为根节点,直接把插入的节点标记为黑色。

情况二:插入的节点的父节点是黑色,什么都不需要做,节点插入之后仍然是一颗红黑树。

情况三:插入节点的父节点是红色,此时违背性质4。此时,可以分三种情况分别来处理。


情况一:插入节点的父节点是红色,叔叔节点是红色。

处理方法:

(1),将父节点标记为黑色。

(2),将叔叔节点标记为黑色。

(3),将祖父节点标记为红色。

(4),将祖父节点标记为"当前节点",之后继续对"当前节点"进行处理。


 

情况二:插入节点的父节点是红色,且当前节点是其父节点的右孩子。

处理方法:

(1),将父节点作为"当前节点"。

(2),以"当前节点"为支点左旋。



情况三:插入节点的父节点是红色,且当前节点是其父节点的左孩子。

处理方法:

(1),将父节点标记为黑色。

(2),将祖父节点标记为红色。

(3),以祖父节点为支点进行右旋。



五,红黑树的效率

查找操作的时间复杂度与树的深度成正比,故对红黑树的查找,最坏情况下的时间复杂度为O(log)。若考虑到红黑树的动态查找特性,即在查找失败时插入该节点,这时最坏的情况是发生树的形状连续调整,但是调整次数不会超过树的深度,故时间复杂性仍保持为O(log)。综上所述,红黑树是一种高效的查找树。

0 0