一、定义
二叉排序树的时间复杂度为 O(n),平衡二叉排序树的时间复杂度为 O(logn)
平衡二叉树又称 AVL 树,是一种特殊的二叉排序树,拥有更高的查询效率。平衡二叉树或是一棵空树,或满足下列性质的一棵非空的二叉树T:
- T的左子树和右子树的深度之差的绝对值不超过1;
- T的左子树和右子树均为平衡二叉树。
二叉树T的结点平衡因子BF(Balance Factor)为左子树的深度减去右子树的深度,树种
二、算法思想
在建立平衡二叉树的过程中,每插入一个新的关键字都要进行检查,看是否新关键字的插入会使得原平衡二叉树失去平衡,即树中出现平衡因子绝对值大于1的结点。如果失去平衡则需要进行平衡调整。
三、平衡调整
-
当失去平衡的最小子树被调整为平衡子树后,无需调整原有其它所有的不平衡子树,整个二叉排序树就会成为一棵平衡二叉树。
-
最小不平衡子树: 以距离插入结点最近,且以平衡因子绝对值大于1的结点作为根的子树。
(1)LL型平衡旋转法
插入点是最小不平衡子树的左子树之左子树。
由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。
(2)RR型平衡旋转法
插入点是最小不平衡子树的右子树之右子树。
由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行一次逆时针旋转操作。即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。而原来C的左子树则变成A的右子树。
(3)LR型平衡旋转法
插入点是最小不平衡子树的左子树之右子树。
由于在A的左孩子B的右子数上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。
- 先将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置
- 然后再把该D结点向右上旋转提升到A结点的位置。即先使之成为LL型,再按LL型处理。
其中,调整的中间状态如下(对应的步骤一:将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置)
(4)RL型平衡旋转法
插入点是最小不平衡子树的右子树之左子树。
由于在A的右孩子C的左子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针)。
- 先将A结点的右孩子C的左子树的根结点D向右上旋转提升到C结点的位置
- 然后再把该D结点向左上旋转提升到A结点的位置。即先使之成为RR型,再按RR型处理。
其中,调整的中间状态如下(对应的步骤一:将A结点的右孩子C的左子树的根结点D向右上旋转提升到C结点的位置)