数据结构之树与二叉树的应用:平衡二叉树(AVL)

平衡二叉树的定义:

在这里插入图片描述

如何计算高度为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平衡旋转(先右后左双旋转)

在这里插入图片描述
例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值