AVL树的建立解析含代码(C++)

AVL树

AVL树是平衡二叉树,它可以尽可能创建“枝繁叶茂”的树,防止树枝过长过少。二叉树搜索中,会引入ASL平均查找长度的概念,表示查找所有节点的比较次数平均值。平衡二叉树的ASL相较而言较小。

思路

AVL树就是比较各个节点左右子树的深度差,当差值等于2时就需要对树结构进行改变。改变的方式有左旋、右旋、左右旋以及右左旋。判断旋转方式是看导致深度差值的结点在哪。左旋是顺时针旋转相关结点,右旋为逆时针旋转相关结点。左右旋及右左旋为左旋、右旋的组合,左右旋先右旋后左旋。
如下面图的示例:



以上图片来自陈越《数据结构》一书。
关于旋转结点的代码不是很难,RL旋和LR旋为各是两个单旋的组合,L旋和R旋的思路又都一样。因此只要搞懂一个方向的单旋即可。注意单旋时旋转结点的子结点位置的改变。具体的看代码。

代码

#include <iostream>
using namespace std;

/*avl平衡树的建立,需要判断一个节点左右两子树的深度差,差值小于2视为平衡*/
typedef struct node{
   
	int data;
	node* lchild;
	node* rchild;
	int height;
}*bitTree;

int max(int a,int b)
{
   //用于比较子树大小 
	return a>b?a:b;	
} 
int getHeight(bitTree T)
{
   //获取树的高度 
	int lnum,rnum,count;
	if(T){
   
		lnum = getHeight(T->lchild);
		rnum = getHeight(T->rchild);
		count = lnum>rnum?lnum:rnum;//比较左右子树的高度取最大值 
		return (count+1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kki_m

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值