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

AVL树的四种旋转

AVL树是c++中很常用的数据结构,其独有的特点使得其增删查改的效率都是logn级别。AVL树中最核心的是四种旋转方式,我将从代码入手去分析四种旋转的特点,具体图例就不画了。

	// 右单旋void RotateR(Node* parent)//画图解释,最为直观。{Node* subL = parent->_pLeft;//记录左子树顶点位置Node* subLR = subL->_pRight;//记录顶点位置的右节点,可能为nullptrparent->_pLeft = subLR;//将目前节点的左节点设置为刚刚记录的subLR,不违背搜索二叉树的原则if (subLR)//如果subLR是空的话,pass。如果不是,那就让它认parent作爹{subLR->_pParent = parent;}subL->_pRight = parent;//让subL的右儿子成为parentparent->_pParent = subL;//让parent认subL作爹if (parent == _Proot)//如果这个parent是根,也是parent没爹{subL->_pParent = nullptr;//因为变换以后,subL就是根了,那他也就没爹了_root = subL;}else{subL->_pParent = parent->_pParent;//如果parent有爹,那就让subL换个爹if (parent->_pParent->_pLeft == parent)//这串if/else的逻辑总体用于判断parent到底是他爹的左孩子还是右孩子{parent->_pParent->_pLeft = subL;}else if (parent->_pParent->_pRight == parent){parent->_pParent->_pRight = subL;}}subL->_bf = 0;//默认调整以后这个左孩子和parent就是圆满的了parent->_bf = 0;}
// 左单旋
void RotateL(Node* parent)
{Node* subR = parent->_pRight;//Node* subRL = subR->_pLeft;parent->_pRight = subRL;if (subRL){subRL->_pParent = parent;}subR->_pLeft = parent;if (parent == _Proot){subR->_pParent = nullptr;parent->_pParent = subR;}else{subR->_pParent = parent->_pParent;if (parent->_pParent->_pLeft == parent){parent->_pParent->_pLeft = subR;}else if (parent->_pParent->_pRight == parent){parent->_pParent->_pRight = subR;}}subR->_bf = 0;parent->_bf = 0;
}
	// 右左双旋void RotateRL(Node* parent){Node* subR = parent->_pRight;//记录parent右子树的地址。Node* subRL = subR->_pLeft;//记录subR左子树的地址。int bf = subRL->_bf;//记录subRL的平衡因子,这在后面判断会有大用处。RotateR(parent->_pRight);//双旋的本质就是调用两次单旋转,先调用一次右单旋,再调用一次左子树RotateL(parent);if (bf == 0)//约定俗成的{parent->_bf = 0;subL->_bf = 0;subLR->_bf = 0;}else if (bf == 1){parent->_bf = 0;subL->_bf = -1;subLR->_bf = 0;}else if (bf == -1){parent->_bf = 1;subL->_bf = 0;subLR->_bf = 0;}else {assert(false);//如果调到了这里,表示之前bf的相关代码有写错的}}
	// 左右双旋void RotateLR(Node* parent){Node* subL = parent->_pLeft;Node* subLR = SubL->_pRight;int bf = subLR->_bf;RotateL(parent->_pLeft);RotateR(parent);if (bf == 0){parent->_bf = 0;subL->_pLeft = 0;subLR->_pLeft = 0;}else if (bf == 1){parent->_bf = 0;subL->_pLeft = -1;subLR->_pLeft = 0;}else if (bf == -1){parent->_bf = 1;subL->_pLeft = 0;subLR->_pLeft = 0;}else {assert(false);}}

http://www.dtcms.com/a/323390.html

相关文章:

  • 【Python 语法糖小火锅 · 第 4 涮】
  • 资深全栈工程师面试题总结
  • 【牛客刷题】小红的区间删除
  • 第16届蓝桥杯Scratch选拔赛初级及中级(STEMA)2024年11月24日真题
  • Linux之shell脚本篇(四)
  • SQL 172 未完成试卷数大于1的有效用户
  • 9. 堆和栈有什么区别
  • 01数据结构-图的邻接矩阵和遍历
  • 从零开始理解编译原理:设计一个简单的编程语言
  • svg 图片怎么设置 :hover 时变色
  • 交 换
  • sigaction 中 sa_handler = SIG_IGN 的深度解析与应用实践
  • day14 - html5
  • 2025年TOP5服装类跟单软件推荐榜单
  • 复杂正则语句(表格数据)解析
  • CentOS7运行AppImage
  • 历史数据分析——首旅酒店
  • 电子电气架构 --- 48V车载供电架构
  • ubuntu修改密码
  • 基于dynamic的Druid 与 HikariCP 连接池集成配置区别
  • 论文阅读 2025-8-3 [FaceXformer, RadGPT , Uni-CoT]
  • 数论——约数之和、快速乘
  • 新手入门:Git 初次配置与 Gitee 仓库操作全指南 —— 从环境搭建到代码推送一步到位
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • Java基础-完成局域网内沟通软件的开发
  • day 16 stm32 IIC
  • day 35_2025-08-09
  • 202506 电子学会青少年等级考试机器人四级器人理论真题
  • Java -- 日期类-第一代-第二代-第三代日期
  • 05.【数据结构-C语言】栈(先进后出,栈的实现:进栈、出栈、获取栈顶元素,栈实现代码,括号匹配问题)