树与二叉树的应用:平衡二叉树
平衡二叉树的定义:
如何计算高度为h的最小平衡二叉树的节点数Nh?
1、为满足树的高度为h,取根节点的左子树高度为N(h-1)
2、为满足平衡二叉树,根节点的右子树可以取N(h),N(h-1),N(h-2)
3、若为N~h~,则不满足高度为h的要求
4、若为N~h-1~,则不满足最小的要求
5、所以根节点的右子树为N(h-2)
6、所以节点总数为N(h) = N(h-1)+N(h-2)+1
7、又因为N(0)=0;N(1)=1;
8、根据动态规划算法或者递归算法即可求解
如何判断一颗树为平衡二叉树?
PS: n表示高度,b表示是否平衡(n=1平衡,n=0不平衡)
代码实现:
void Judge_AVL(BiTree bt,int &balance,int &h){ //根节点,平衡性,高度
int bl = 0;br = 0;hl = 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) //判断平衡性1
balance = 1;
else
balance = 0
}
}
平衡二叉树的插入:
先进行二叉排序树的插入过程,插入完成后在进行调整
调整的前提: 每次调整最小的不平衡子树
方法一、LL平衡旋转(右单旋转)
ps: BL指B的左子树;BR指B右子树;AR指A的右子树
例:
方法二、RR平衡旋转(左单旋转)
例:
方法三、LR平衡旋转(先右后左双旋转)
例:
方法四、RL平衡旋转(先右后左双旋转)
例: