1、
》》 说明:红黑树(red-black tree)是许多“平衡”搜索树中的一种, 可以保证在最坏情况下基本
动态集合操作的时间复杂度为O( lg n)。
2、红黑树的性质
》》 1)、红黑树是一种二叉搜索树,它在每个结点上增加一个存储位来表示结点的颜色,可以是
RED 或者 BLACK 。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑
树确保没有一条路径会比其他路径长出 2 倍,因而是近似于平衡的。
》》 2)、树中每个结点包含 5 个属性:color 、 key 、 left 、right 、 p 。如果一个结点没有子结点
或者父结点,则该结点相应指针属性的值为 NIL 。
》》 3)、一棵红黑树是满足下面“红黑性质”的二叉搜索树:
性质1: 每个结点或是红色的,或是黑色的
性质2: 根节点是黑色的
性质3:每个叶结点(NIL)是黑色的
性质4: 如果一个结点是红色的,则它的两个子结点都是黑色的
性质5:对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
补充:红黑树的案例
》》4)、哨兵 T.NIL (黑色的):
为了便于处理红黑树代码中的边界条件,使用一个“哨兵”来代表 NIL 。对于一棵红黑树 T ,
哨兵 T.nil 是一个与树中普通结点有相同属性的对象。它的 color 属性为 BLACK ,而其他
属性 left 、 right 、key 和 p 可以设为任意值。
补充:使用一个哨兵 T.nil 来代表所有的 NIL (“ 所有的叶结点 ” 和 “ 根结点的父结点 ”),
哨兵的属性 p 、 left 、 right 、 key 的取值并不重要。
》》 5)、“ 黑高 ”的概念:
## 从某个结点 x 出发(不包该结点)到达一个叶结点的任意一条简单路径上的黑色结点个数
称为该结点的“ 黑高 (black-height)” ,记为 bh(x) 。
## 根据上面的性质 5 ,黑高的概念是明确定义的,因为从该结点出发的所有下降到其叶结点
的简单路径的黑结点的个数是相同的。于是定义红黑树的黑高为其根结点的黑高。
》》 引理: 一棵有 n 个内部节点的红黑树的高度至多为 2 lg( n + 1 ) 。
3、旋转
》》 1)、搜索树操作 Tree-Insert 和 Tree-delete 在含 n 个关键字的红黑树上,运行花费时间为
O( lg n ) 。由于这个两个操作对树进行了修改,结果可能违反了红黑树的性质。为了维护
这些性质,必须要改变树中某些结点的颜色以及指针结构。
》》 2)、指针结构的改变是通过“ 旋转 (ratation)” 来完成的,这是一种能保持二叉搜索树性质的
的搜索树局部操作。
## 两种旋转:“ 左旋 ” 和 “ 右旋 ”
4. 插入
》》 1)、我们可以在 O( lg n ) 时间内完成向一棵含有 n 个结点的红黑树中插入一个新结点。
5. 删除
》》 1)、删除一个结点要花费的时间为 O( lg n )。