一、红黑树性质
二叉搜索树中若一个节点没有父节点或子节点则该节点相应属性的值设为NIL,我们视NIL为二叉搜索树的叶节点(外部节点),带关键字的为内部节点。一棵红黑树是满足下列五条性质的二叉搜索树:
1. 树的每个节点不是红色就是黑色
2. 树的根节点是黑色
3. 树的每个叶节点(NIL)为黑色
4. 若节点是红色则它的孩子必须是黑色(若有孩子的话)
5. 树中每一个节点到其后代叶节点的路径上黑色节点的数目相同
红黑树黑高的定义:从某个节点出发(不包含此节点)到达其后代叶节点的路径上黑色节点数目称为此节点的黑高,由性质5知节点到其每个后代叶节点的路径上的黑色节点数目是相同的,因此红黑树的黑高可以定义为根节点的黑高。
定理:一棵具有n个内部节点的红黑树的树高至多是2lg(n+1)
证明: 证明以任一节点x为根的红黑树至少有2^bh(x)-1个内部节点。(bh(x)为节点x的黑高)数学归纳法证明:当bh(x)=0,x为叶节点,则x有0个内部节点,命题成立。当bh(x)=1,则x有1个内部节点,命题成立。考虑一个高度为正值且有两个孩子的内部节点x,其黑高为bh(x)它的孩子的黑高为bh(x) 或bh(x)-1(具 体取那个值与X自身的颜色有关),根据命题节点x的每个孩子至少包含2^(bh(x)-1)-1个内部节点,于是,以x为根的子树至少包含2^(bh(x)-1)-1+2^(bh(x)-1)-1+1=2^bh(x)-1个内部节点。命题证明完毕,设树的高度为h,由红黑树性质4知道从根到叶节点(不包括根节点)的任一条路径至少有一半的节点为黑色,因此,根的黑高bh(x)>=h/2,所以由n>=2^bh(x)-1>=2^(h/2)-1,因此可得h<=2lg(n+1)。
注意:通过对任一一条从根到叶节点的简单路径上各个节点颜色的约束,红黑树确保没有一条路径会比其他路径长出2倍,因此红黑树是近似平衡的。
备注:
红黑树和AVL树(平衡二叉树)的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡
参考:
平衡二叉树(AVL)
二、旋转
- 左旋转
left-rotated(T, x)
{
y = x.right;
x.right = y.left;
if(y.left!=T.nil)
{
y.left.p = x;
}
y.p = x.p;
if(x.p == T.nil)
{
T.root = y;
}
else if(x == x.p.left)
{
x.p.left = y;
}
else if(x == x.p.right)
{
x.p.right = y;
}
y.left = x;
x.p = y;
}
- 右旋转
right-rotated(T, y)
{
x = y.left;
y.left = x.right;
if(x.right!=T.nil)
{
x.right.p = y;
}
x.p = y.p;
if(y.p == T.nil)
{
T.root = x;
}
else if(y == y.p.left)
{