AVL的部分理解

文章目录

预备知识

二叉树;二叉查找树;AVL树的基本定义,AVL树的左旋,右旋。
(关于原理性的问题请移步《算法笔记》P319,这里仅仅是解释一下关于 插入的理解)

  • 结点的结构
struct node{
	int v,height;
	node *lchild, *rchild;
};
  • 定义新的结点(可以理解为是根节点)
node * newNode(int x){
	node * Node=new node;
	Node->v=x;
	Node->height=1;//作为初始结点,高度为1;
	Node->lchild=Node->rchild=NULL;
return Node;
}
  • 获取当前结点所在的height
int getHight(node * root){
	if(root==NULL)return 0;
	else return root->height;
}
  • 计算当前结点平衡因子(左子树高度-右子树高度)
int getheightFractor(node * root){
	return getHight(root->lchild)-getHeight(root->rchild)
  • 更新结点的height
void updatedHeight(node * root){
	root->height=max(getHeight(root->lchild),getHeight(root->rchild)+1;
  • 左旋
void L(node *&root){//这里有引用,即为了能够修改这个结点r
	node * temp=root->rchild;//建立一个新的结点t,用来代替root->rchild
	root ->rchild=temp->lchild;//进行子树上的替换
	temp->lchild=root;
	updatedHeight(root);
	upratedHeight(temp);//进行各自高度的更新(因为各自的子树的高度是没有更替的)
	root=temp;//(此时temp已经坐上了root的位置,给换回来,temp在其中起的作用就是作为一个中间变量,便于其他各个量的替换)
}
  • 右旋(同理不赘述)
void r(node *&root){
	node *temp=root->lchild;
	r->lchild=temp->rchild;
	temp->rchild=root;
	updatedHeight(root);
	updatedHeight(temp)
	root=temp;
}

插入

观察发现,只有将最靠近插入点的失衡结点调整到正常,其他的所有结点都会正常。
那么可以先假设有一个失衡点A(则失衡因子为2,-2)
则会出现LL LR RL RR四种情况。
LL->把C看成一个整体,在A处进行一个右旋操作;
LR->先左旋成LL结构,再重复LL;
RR->左旋;
RL->先右旋成RR,再重复RR;
我是个憨憨,写了一遍博客,才明白意思

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值