
平衡二叉树(AVL)
任意结点的平衡因子的绝对值不超过1(左子树高度−-−右子树高度)。
高度为hhh的最小平衡二叉树的结点数NhN_hNh:

右子树可以有三种选择:NhN_{h}Nh、Nh−1N_{h-1}Nh−1、Nh−2N_{h-2}Nh−2。
- 如果是NhN_{h}Nh,则加上根结点高度会超过hhh,不可能;
- h−1h-1h−1层的结点数一定大于h−2h-2h−2层的结点数,因此最小的平衡二叉树应在h−2h-2h−2层的子树上。
Nh=Nh−1+Nh−2+1 N_h=N_{h-1}+N_{h-2}+1 Nh=Nh−1+Nh−2+1
N0=0N_0=0N0=0,N1=1N_1=1N1=1。
判断
利用递归遍历的后序遍历过程:
- 判断左子树是一棵平衡二叉树
- 判断右子树是一棵平衡二叉树
- 判断该结点为根的二叉树为平衡二叉树
判断条件:
若左子树和右子树均为平衡二叉树
且左子树与右子树高度的绝对值小于等于111,则平衡。

void Judge_AVL(BiTree bt, int &balance, int &h){
int bl=0,br=0mhl=0,hr=0;
if(bt==NULL){
h=0;
balance=1;
}
else if(bt->lchild==NULL&&bt->rchild==NULL){
h=1;
balance=1;
}
else{
Judge_AVL(bt->lchild,bl,hl);
Judge_AVL(bt->rchild,br,hr);
if(hl>hr)
h=hl+1;
else
h=hr+1;
if(abs(hl-hr)<2&&bl=1&&br=1)
balance=1;
else
balance=0;
}
}
插入
对二叉排序树进行优化:先插入,再调整,每次调整最小不平衡二叉树

LL平衡旋转(右单旋转)
原因:在结点AAA的左孩子的左子树上插入了新结点。
调整方法:右旋操作——将AAA的左孩子BBB代替AAA,将AAA结点称为BBB的右子树根结点,而BBB的原右子树则作为AAA的左子树。



RR平衡旋转(左单旋转)
原因:在结点AAA的右孩子的右子树上插入了新结点。
调整方法:左旋操作——将AAA的右孩子BBB代替AAA,将AAA结点称为BBB的左子树根结点,而BBB的原左子树则作为AAA的右子树。



LR平衡旋转(先左后右双旋转)
原因:在结点AAA的左孩子的右子树上插入了新结点。
调整方法:先左后右双旋转——将AAA的左孩子BBB的右孩子结点CCC代替BBB,然后再将CCC结点向上代替AAA的位置。


RL平衡旋转(先右后左双旋转)
原因:在结点AAA的右孩子的左子树上插入了新结点。
调整方法:先右后左双旋转——将AAA的右孩子BBB的左孩子结点CCC代替BBB,然后再将CCC结点向上代替AAA的位置。


本文介绍了平衡二叉树(AVL)的概念,其特点是任意节点的平衡因子绝对值不超过1。讨论了如何判断一棵二叉树是否为平衡二叉树,以及在插入新节点后如何通过单旋转和双旋转进行调整,包括LL、RR、LR和RL四种旋转方式,以保持树的平衡状态。
475

被折叠的 条评论
为什么被折叠?



