一棵高度为h的查找树的各种操作的性能为O(h),当树的高度较低时,性能较好,当高度很高时,和链表没什么区别。从上一章可以知道,随机构造的二叉查找树的期望高度为O(lgn)。本章介绍一种平衡的查找树:红黑树,确保在最坏情况下,基本动态集合的操作时间为O(lgn)。
红黑树的性质:
1) 每个结点是红的或黑的
2) 根节点是黑的
3) 每个叶节点(NIL)是黑的
4) 如果一个结点是红的,那么它的两个儿子是黑的;换言之红结点的父节点必然是黑的
5) 对每个结点,从该节点到该子树所有叶结点的所有路径上,包含相同数目的黑结点
为了方便处理,我们用一个哨兵来代表NIL结点,该节点是黑的,不存储实际数据,数据存储在内部节点上。
在定义从某个结点出发(不包括该结点)到达一个叶子结点的任意一条路径上黑结点的个数为黑高度bh(x)。
红黑树的高度:一棵n个内结点的红黑树的高度至多为2lg(n+1)
先证明一棵以结点x为根的子树至少包含内结点数,采用数学归纳法。对黑高度为0,则包含内节点数为0,上式成立。对于结点x来说,考虑x的颜色,它的两棵子树的黑高度可能为bh(x)-1或bh(x),那么以x为根的子树包含的内节点数至少为。
有了上面的引里,可知一棵树的黑高度bh <= lg(n+1),又树高度h最多为黑高度的两倍,所以有 h <= 2lg(n+1)。
还有另外一种证明方法:
假设将所有的红结点收缩到其黑父结点中,其孩子成为其父的孩子。那么红黑树将会变成一棵只包含黑结点的树,每个内结点最多有4个孩子结点,最少有2个孩子结点,树的高度为原树的黑高度。
依据二叉树的性质,原树的叶节点树为 n+1, n为内结点数。上述的收缩后的树叶节点的数目不变,同时这棵收缩树的特征又有 n+1 <= 4bh,且n+1>=2bh。于是bh <= lg(n+1), h<2lg(n+1)。
红黑树的插入和删除
将一个结点插入红黑树,可能会破坏红黑树的性质,这个时候要通过旋转和重新着色来保持红黑树的性质。在不同的case下有不同的旋转和着色方法,原书中有详细的说明,这里不再赘述。
删除操作也是类似的。
思考题:
AVL树
AVL树是一棵高度平衡的二叉树,在每一个结点里面维护一个额外的域h(x),即结点的高度。AVL树要求任何结点的左子树和右子树的高度最多差1。
1) n个结点的AVL树的高度为O(lg(n))。
用数学归纳法,高度为1的树的结点数F1>=2。依据AVL的定义,Fk>=Fk-1+Fk-2。可知高度为h的AVL树的最少节点数就是第h个斐波那契数。
2)将一个结点插入AVL树,可能引起高度的不平衡,此时需要进行旋转。