平衡二叉树(AVL),任意结点的平衡因子的绝对值不超过一(左子树高度-右子树高度)。
高度为h的最小平衡二叉树的结点数。
平衡二叉树的判断
利用递归的后序遍历过程:
1、判断左子树是一个平衡二叉树
2、判断右子树是一个平衡二叉树
3、判断以该结点为根的二叉树为平衡二叉树
判断条件:若左子树和右子树均为平衡二叉树,且左子树与右子树高度差的绝对值小于等于1,则平衡。
void Judge_AVL(BiTree bt,int &balance,int &h){
int b1=0;br = 0;h1 = 0;
if(bt==null)
h=0;
balannce = 1;
else if(bt->lchild==null&&bt->rchild==null)
h=1;
balance=1;
else
Judge_AVL(bt->lchild,b1.h1);
Judge_AVL(bt->rchild,b1.h1);
if(h1>hr)
h=h+1;
else
h=hr+1;
if(abs(h1-hr)<2 && b1==1 && br==1)
balance=1;
else
balance=0;
}
平衡二叉树的插入
先插入,正调整,每次调整最小不平衡子树
LL平衡旋转(右单旋转)
原因:在结点A的左孩子的左子树上插入了新结点。
调整方法:右旋操作,将A的左孩子B代替A,将A结点称为B的右子树根结点,而B的原右子树则作为A的左子树。
RR平衡旋转(左单旋转)
原因:在结点A的右孩子的右子树上插入了新结点。
调整方法:左旋操作,将A的右孩子B代替A,将A结点称为B的左子树根结点,而B的原右左树则作为A的右子树。
LR平衡旋转(先左后右双旋转)
原因:在结点A的左孩子的右子树上插入了新结点。
调整方法:先左旋后右旋操作,将A的左孩子B的右孩子结点C代替B,然后再将C结点向上代替A的位置。
RL平衡旋转(先右后左双旋转)
原因:在结点A的右孩子的左子树上插入了新结点。
调整方法:先右旋后左旋操作,将A的右孩子B的左孩子结点C代替B,然后再将C结点向上代替A的位置。