学习 《算法导论》第13章 红黑树 总结一
前面学习了二叉查找树,我们知道一棵高度为h的二叉查找树实现的任何一种动态集合操作,其时间都是O(h); 但若二叉查找树退化为n个结点的线性链后,则最坏情况运行时间为O(n); 下面说的红黑树能保证在最坏情况下,任何一种动态集合操作的运行时间为O(h);
红黑树介绍
红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或BLACK;通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。
上面说了红黑树是一种二叉查找树,所以红黑树也满足二叉查找树的基本性质。
红黑树的五个基本性质
红黑树中每个结点包含五个域:key, left, right, parent, color;
一棵二叉查找树若满足下面的红黑性质,则是一棵红黑树:
1. 每个结点要么是红色的,要么是黑色的
2. 根结点一定是黑色的
3. 每个叶结点(这里的叶结点指的是:树尾端NULL指针或NULL结点)都是黑色的
4. 若一个结点是红色的,则它的两个儿子都是黑色的
5. 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点.
而这五条性质就保证了红黑树在基本的动态集合操作的最坏情况时间为O(h).
注意:这里说的叶结点和之前说的叶结点不同,可以忽略这条,将注意力放在红黑树的内部结点。这里的叶结点并不包含数据,就是个NULL结点。
下面是一棵有叶结点(NULL结点)的红黑树图:
之后的学习我们不画出NULL结点。
结点黑高度:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上,黑色结点的个数。
由第五条性质,可以保证从该结点出发的所有下降路径都有相同的黑结点个数,所以可以定义红黑树的黑高度为其根结点的黑高度。
LINUX的内存管理里面用了红黑树,其定义路径在:
include/Linux/rbtree.h,有空可以去学习下。
红黑树结点的C定义
typedef struct RB_Node
{
struct RB_Node* parent; // 指向父结点
struct RB_Node* left;
struct RB_Node* right;
ElemType data; // key data
int color; // 取值:0--RED, 1--BLACK
}RN_Node, *RB_Tree;