如果说平衡二叉树是一个类的话,那么红黑树就是该类的一个实例。
AVL树的定义:
一棵AVL树满足以下的条件:
1>它的左子树和右子树都是AVL树
2>左子树和右子树的高度差不能超过1
从条件1可能看出是个递归定义,如GNU一样.
性质:
1>一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)
2>一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)).
3>一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n)).
那么如何让生成的二叉树是平衡二叉树呢?实际上结论只有一句话:每插入一个结点就进行调整使之平衡。说到调整策略,根据二叉排序树失去平衡的不同原因共有四种调整方法。下面就进行逐一分析:首先我们假设在二叉排序树中因为插入结点而失去平衡的最小子树的根结点是a,即a的平衡因子的{jd1}值大于1,且在a和根结点之间没有其他结点失去平衡,(因为插入的结点只有一个,所以不会有a的兄弟结点的子树失去平衡)。
{dy}种情况:LL型平衡旋转
由于在A的左子树的左子树上插入结点使A的平衡因子由1增到2而使树失去平衡。调整方法是将子树A进行一次顺时针旋转。
第二种情况:RR型平衡旋转
其实这和{dy}种LL型是镜像对称的,由于在A的右子树的右子树上插入结点使得A的平衡因子由1增为2;解决方法也类似,只要进行一次逆时针旋转。
第三种情况:LR型平衡旋转
这种情况稍复杂些。是在A的左子树的右子树C上插入了结点引起失衡。但具体是在插入在
C的左子树还是右子树却并不影响解决方法,只要进行两次旋转(先逆时针,后顺时针)即可恢复平衡。
第四种情况:RL平衡旋转
也是LR型的镜像对称,是A的右子树的左子树上插入的结点所致,也需进行两次旋转(先顺时针,后逆时针)恢复平衡。
红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。
红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。之前我们在讲解AVL树时,已经领教过AVL树的复杂,但AVL树的复杂比起红黑树来说简直是小巫见大巫。红黑树是真正的变态级数据结构。
红黑树的平衡
红黑树首先是一棵二叉查找树,它每个结点都被标上了颜色(红色或黑色),红黑树满足以下5个性质:
1、 每个结点的颜色只能是红色或黑色。
2、 根结点是黑色的。
3、 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点n的只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。
4、 如果一个结点是红的,则它的两个儿子都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、 对于每个结点来说,从该结点到其子孙叶结点的所有路径上包含相同数目的黑结点。
具体的构造方法参加STL源码分析;