1、二叉平衡树
二叉树平衡树简称平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树。其定义就是若一棵二叉树的每个左右结点的高度差最多相差1,此二叉树即是二叉平衡树。
二叉排序树查找、插入和删除操作的时间复杂度和树的深度h有关。构建树时,当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长度为(n+1)/2,查找效率比较低。提高查找效率,关键在于最大限度地降低树的深度h。因此需要在构建二叉排序树的过程中进行“平衡化”处理,使之成为二叉平衡树。
二叉平衡树,又称AVL树。它或者是一棵空树,或者是具有下列性质的树:
1)具备二叉排序树的所有性质;
2)左子树和右子树深度差的绝对值不超过1;
3)左子树和右子树都是二叉平衡树。
把二叉树的每个结点的左子树减去右子树定义为该结点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。
结点高度定义:空结点的高度为0;非空结点的高度为以该结点为根结点的树的高度。
2、二叉平衡树调整
当插入一个新的结点时,在普通的二叉树中不用考虑树的平衡因子,只要将大于根结点的值插入到右子树,小于根结点的值插入到左子树,递归即可。而在二叉平衡树则不一样,在插入结点时,检查树是否因插入操作而失衡,若失衡,则找出其中的最小不平衡二叉树,对最小不平衡二叉树进行调整,以达到新的平衡。
主要分为以下三种情况:
1)若插入前一部分结点的左子树高度和右子树高度相等,即平衡因子为0,插入后平衡因子变为1,仍符合平衡的条件不用调整。
2)若插入前左子树高度小于右子树高度,即平衡因子为-1,则插入后将使平衡因子变为0,平衡性反倒得到调整,所以不必调整。
3)若插入前左子树的高度大于右子树高度,即平衡因子为1,则插入左子树之后会使得平衡因子变为2,这样的情况下就破坏了平衡二叉树的结构,所以必须对其进行调整,使其加以改善。
调整二叉树首先要明白一个定义,即最小不平衡子树。最小不平衡子树是指以离插入结点最近、且平衡因子绝对值大于1的结点做根的子树。平衡二叉树最基本的4种调整操作,调整的原则是调整后它的搜索二叉树的性质不变,即树的中序遍历是不会改变的。
3、处理失衡的四种旋转方式
对最小不平衡树进行调整的操作是旋转,共有4种旋转方式LL型,LR型,RL型,RR型。
1)LL型调整
在B点的左子树上插入一个结点。
插入后B结点的左子树的平衡因子变为1,A结点的平衡因子变为2。
可以看出A结点为根结点的子树是最小不平衡子树。
调整时,将A的左孩子B向右旋转代替A(原来不平衡子树的根结点),将A的结点右下旋转变为B的右子树的根结点,而B的原右子树变为A的左子树。
2)RR型调整
在A结点的右孩子的右子树上插入结点。
插入后B结点的右子树的平衡因子变为-1,A结点的平衡因子变为-2。
可以看出A结点为根结点的子树是最小不平衡子树。
调整时,将A的右孩子B向左旋转为A的左孩子,A的左孩子变为B的左孩子,而B原右子树变为A的右子树。
3)LR型调整
在A结点的左孩子的右子树上插入结点,使得A结点的平衡因子由1变为2而引起的不平衡所进行的调整操作。
调整后:
图1调整后
4) RL型调整
在A结点的右孩子的左子树上插入结点,使得A结点的平衡因子由-1变为-2而引起的不平衡所进行的调整操作。
在二叉搜索树的插入和删除运算中,采用平衡树的优点是:使树的结构较好,提高查找运算的速度。缺点是:插入和删除运算变得复杂化,降低其运算速度。对二叉搜索树删除节点而引起的不平衡性进行的操作比插入节点的情况要复杂。