当前位置: 首页 > news >正文

AVLTree 旋转笔记(根据平衡因子插入的公式,贼好理解)

平衡因子

avltree是一棵每个节点的左右子树的高度差不超过1的二叉树搜索树,对于avltree最重要的就是对平衡因子的控制。





对于旋转我们重点要注意的是三个节点,以左旋举例,需要注意的就是parent,subr,subrl。而旋转的方式有四种,我们只需要根据对应的平衡因子来去判断该怎样旋转就行。

左旋


对于左旋, 我们可以用一张图来概括

这里的h是指高度>=0的avl树这里只适用于parent平衡因子为2subr平衡因子为1的情况
我们需要注意这三者关系的变化,以及对应平衡因子的更新。
根据这几点我们就能写出对应的旋转代码:

	void rotateL(avltnode*parent){//获得对应节点avltnode* subr = parent->_right;avltnode* subrl = subr->_left;avltnode* parentParent = parent->_parent;// 更新parent的右parent->_right = subr->_left;//更新subr的右节点subr->_left = parent;//更新parent的父节点parent->_parent = subr;//判断subrl是否为空节点,如果不为空就更新subrl的父节点if (subrl)subrl->_parent = parent;//判断parentParent节点是否为空if (parentParent == nullptr){//为空说明走到了最上面的节点subr->_parent = nullptr;_node = subr;}else{//如果没有则判断是要放在左边还是右边。if (parentParent->_left == parent)parentParent->_left = subr;else if (parentParent->_right = parent)parentParent->_right = subr;subr->_parent = parentParent;}//更新平衡因子subr->_bf = parent->_bf = 0;}

右旋

右旋也是可以用一张图来概括

这里的h是指高度>=0的avl树这里只适用于parent平衡因子为-2subl平衡因子为-1的情况
逻辑跟左旋差不了多少,代码注释也不过多赘述。
代码:

	//右旋void rotateR(avltnode* parent){avltnode* subl = parent->_left;avltnode* sublr = subl->_right;avltnode* parentParent = parent->_parent;subl->_right = parent;parent->_parent = subl;parent->_left = sublr;//判断sublr是否为空if (sublr) sublr->_parent = parent;//判断parentParent是否为空if (parentParent == nullptr){subl->_parent = nullptr;_node = subl;}else{if (parentParent->_left == parent){parentParent->_left = subl;}else{parentParent->_right = subl;}subl->_parent = parentParent;}subl->_bf = parent->_bf = 0;}

右左双旋

subl,sublr写错了,该市subr,subrl
这里只是一种情况


先将 subr 右旋,再将parent左旋,这里只适用于parent平衡因子为2subr平衡因子为-1的情况
这里的平衡因子更新其实是要根据subrl来定的:
因为subr为-1时subrl肯定是不为空的,这里也有一个总结,当然可以当一个公式记住就行。
代码:

void rotateRL(avltnode* parent)
{avltnode* subr=parent->_right;avltnode* subrl = subr->_left;int bf = subrl->_bf;rotateR(subr);rotateL(parent);//判断平衡因子if (bf == 0){subr->_bf = subrl->_bf = parent->_bf = 0;}else if (bf == 1){subr->_bf = subrl->_bf = 0;parent->_bf = -1;}else if (bf == -1){subr->_bf = 1;subrl->_bf = parent->_bf = 0;}else//如果都不属于就报错{assert(false);}
}

左右双选



这里只适用于parent平衡因子为-2subl平衡因子为1的情况
也就类似于右左双旋
代码:

	void rotateLR(avltnode*parent){avltnode* subl = parent->_left;avltnode* sublr = subl->_right;int bf = sublr->_bf;rotateL(subl);rotateR(parent);if (bf == 0){subl->_bf = parent->_bf = sublr->_bf = 0;}else if (bf == -1){subl->_bf = sublr->_bf = 0;parent->_bf = 1;}else if (bf == 1){subl->_bf = -1;sublr->_bf = parent->_bf = 0;}}

总结

其实说avl树很难,但是当你根据公式来写这棵树,其实他也并不是很复杂。但是最终我们还是要去理解avl树为什么要这样旋转。

http://www.lryc.cn/news/458377.html

相关文章:

  • STM32(十八):SPI通信
  • Redis持久化机制(RDBAOF详解)
  • 蛋白质结构中pdbx_strand_id和entity_id相互转化
  • 【父子线程传值TransmittableThreadLocal使用踩坑-及相关知识拓展】
  • 03 快乐树
  • springboot+react实现移动端相册(上传图片到oss/ 批量删除/ 查看图片详情等功能)
  • Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测|数据分享...
  • Spring Boot驱动的交互式作业管理系统:师生共评功能实现
  • 基于SSM的旅游网站【附源码】
  • Python实现将目标文本批量存入Word,并将文本段落的开头进行缩进处理(11)
  • el-select 下拉框选项文字过长解决方案
  • C语言基础语法——类型转换
  • 来电无通话界面问题分析
  • 物理学基础精解【70】
  • HCIP--以太网交换安全(三)MAC地址漂移防止与检测
  • CSS3--美若天仙!?
  • 详细版的Jsoncpp的使用,包括在VS环境下配置
  • 开发指南070-3d模型
  • 问卷调查毕设计算机毕业设计投票系统SpringBootSSM框架
  • JavaWeb三大组件之Servlet
  • C++设计模式学习详解(23种)
  • Matlab中实现类属性仅在首次创建类实例时初始化
  • FLINK SQL动态表连续查询
  • C++ | Leetcode C++题解之第468题验证IP地址
  • 每日学习一个数据结构-图
  • kali(专业的渗透测试虚拟机)|kali下载链接地址 |kali安装 |kali部署指南
  • 中国地级市生态韧性数据及城市生态韧性数据(2000-2022年)
  • 应对网络安全挑战:App等保测评的重要性与策略
  • vue后台管理系统从0到1搭建(4)各组件的搭建
  • LabVIEW开关磁阻电机特性测量系统