[数据结构4.8]平衡二叉树

平衡二叉树(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的左子树。


LL平衡旋转


RR平衡旋转(左单旋转)

原因:在结点A的右孩子的右子树上插入了新结点。

调整方法:左旋操作,将A的右孩子B代替A,将A结点称为B的左子树根结点,而B的原右左树则作为A的右子树。


左单旋转


LR平衡旋转(先左后右双旋转)

原因:在结点A的左孩子的右子树上插入了新结点。

调整方法:先左旋后右旋操作,将A的左孩子B的右孩子结点C代替B,然后再将C结点向上代替A的位置。


LR平衡旋转


RL平衡旋转(先右后左双旋转)

原因:在结点A的右孩子的左子树上插入了新结点。

调整方法:先右旋后左旋操作,将A的右孩子B的左孩子结点C代替B,然后再将C结点向上代替A的位置。



RL平衡旋转

你可能感兴趣的:([数据结构4.8]平衡二叉树)