![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,未经博主允许不得转载。
一、概念
1.定义与性质
(1)定义
红黑树字义:满足(a)每个结点或是红的,或是黑的(b)根结点是黑的(c)每个叶结点(NIL)是黑的(d)如果一个结点是红的,则它的两个儿子是黑的(e)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点的二叉查找树称为红黑树。
黑高度定义:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上的黑色结点的个数称为x的黑高度。
(2)性质
红黑树确保没有一条路径会比其它路径长出两倍。
一棵有n个内结点的红黑树的高度至多为2lg(n+1)
2.结构
(1)红黑树结点结构
(2)红黑树结构
3.红黑树上的操作
SEARCH
PREDECESSOR
MINIMUM
MAXIMUM
INSERT
DELETE
二、代码
代码说明:
1.使用NIL作为叶子结点,代替NULL,这样可以少一些特殊处理
2.删除一个结点,delete改为remove,一方面是避免与关键字冲突,另一方面,觉得remove语义更符合
3.insert和remove使用int key代替node *z作为参数,觉得这样使用更方便
三、练习
13.1 红黑树的性质
13.1-1
黑高度是指从根结点到叶结点的路径上黑色结点的个数,需要注意的是,计算黑高度时,出发的结点不计算在内,叶结点是指nil结点
13.1-2
不是,因为违反性质4
不是,因为违反性质5
13.1-3
是
13.1-4
叶子深度为黑高度
13.1-5
bh(x)为黑高度,相应的定义rh(x)为红高度,根据RB树性质
rh(x)<=bh(x),而每条路径的bh(x)都想等,最长可能路径bh(x)+rh(x),最短可能路径bh(x),故最长是最短的至多两倍。
13.1-6
最多:2^(2k+1)-1
高少:2^(k)-1
13.1-7
比值最大为2:1,奇数层的结点为红色,偶数层的结点为黑色。n为奇数。
比值最小为0,全部结点都为黑色
13.2 旋转
13.3 插入
13.3-1
1楼说得很好
13.3-2
运行以上程序能得到结果
13.3-6
令待插入的元素是z。在插入的过程记录从根结点到z的路径,并用栈存储。那么z的父结点就是栈顶元素,z的祖父结点就是栈的次顶元素。
在向上迭代的过程同时出栈,控制好出栈的时间,就能正确实现RB-INSERT
13.4 删除
四、思考题
13-1 动态持久集合