一、平衡二叉树的定义
1、二叉树高度定义
空二叉树高度为0,仅含1个根节点高度为1;二叉树中所有叶子节点的最大路径长度,即根节点到叶子节点的最大长度为二叉树高度。
2、平衡二叉树定义
任一节点的左右子树的高度相差不超过1的二叉树为平衡二叉树。即对任一节点,设左子树高度L,右子树高度H,则|L-H|<=1
3、平衡二叉排序树AVL
既是平衡二叉树,又是二叉排序树的二叉树,简称平衡二叉树,即一般所指的平衡二叉树是平衡二叉排序树。
AVL树递归定义:
平衡二叉树或是一个空的二叉排序树,或满足:
(1)根节点的左子树和右子树高度差最多为1
(2)根节点的左子树和右子树也是平衡二叉树
4、节点平衡因子定义
左子树高度减去右子树高度。平衡二叉树的每个节点的平衡因子只能是-1、0、1
5、最小不平衡子树
指在平衡二叉树的构造过程中,当插入一个节点而导致原平衡变为不平衡时,距离该插入节点最近的、且平衡因子的绝对值大于1的节点为根的子树。
二、平衡二叉树的构造
在构造二叉排序树过程中,每插入一个节点时,检查是否因插入而破坏了树的平衡性,若破坏了,则找出最小不平衡子树。保持二叉排序树特性前提下,调整最小不平衡子树进行“旋转”,使之成为新的平衡树。
三、平衡二叉树的调整
设最小不平衡子树根节点为A,
(1)LL型调整(向右旋转)
在最小不平衡子树根节点A的左孩子的左子树上插入一个节点导致不平衡。
在A的左孩子B的左子树上插入一个节点。插入后B点的左子树的平衡因子变为1,A节点的平衡因子变为了2。这样可以看出来以A为根节点的子树是最小不平衡子树。调整时,将A的左孩子B向右旋转代替A称为原来不平衡子树的根节点,将A的节点右下旋转成为B的右子树的根节点,而B的原右子树变为A的左子树(以A为根向右的顺时针旋转)。详细过程如下图:
(2)RR型调整(向左旋转)
由于在最小不平衡子树根节点A的右孩子的右子树上插入一个节点,使A失去平衡。
在A节点的右孩子B的右子树上插入节点,使得A节点的平衡因子由-1变为-2而引起的不平衡所进行的调整操作(以A为根向左的逆时针旋转)。
调整过程如图:
(3)LR型调整
由于在最小不平衡子树根节点A的左孩子的右子树上插入一个节点导致A不平衡。
在A节点的左孩子B的右子树上插入节点,使得A节点的平衡因子由1变为了2而引起的不平衡所进行的调整的操作:
解释:LR型先向左转再向右旋转。
B先变为C的左子树,CL变为B的右子树(以B为根向左逆时针旋转);
然后右旋的含义为A变成C的右子树,CR变为A的左子树(以A为根向右的顺时针旋转)。
(4)RL型调整
由于在最小不平衡子树的根节点A的有孩子的左子树上插入一个节点使A失去平衡。
先右旋后左旋
第一次旋转(以B为根向右的顺时针旋转):将C插入A与B之间,CR作为B的左子树,
第二次旋转(以A为根向左的逆时针旋转):A作为C的左孩子,CL作为A的右子树