当前位置:

首页 > 编程开发 > C++实现二叉平衡树(AVL)旋转 _ LL/RR/LR/RL四种情况【源码】

C++实现二叉平衡树(AVL)旋转 _ LL/RR/LR/RL四种情况【源码】

平衡二叉树的旋转操作包括LL、RR单旋和LR、RL双旋,用于恢复平衡。插入后失衡仅需一次旋转并立即返回;删除则需持续向上回溯至根节点,因为可能多次失衡。旋转后必须更新所有涉及节点的高度,否则后续平衡判断会出错,导致树结构错误。高度更新是平衡因子计算的基础,遗漏会引发误判。

二叉平衡树的旋转,说白了就是通过几套标准动作,让树在插入或删除后重新恢复平衡。LL/RR 是单次旋转,核心是把子节点提为新根,同时更新两个节点的高度;而 LR/RL 则是两次单旋的组合,需要先修正子树再旋转根,总共涉及三个节点的高度更新。插入操作一旦遇到失衡,立刻旋转并返回,后续不再向上回溯;但删除操作不同,一次旋转可能不够,必须持续检查直到根节点。

C++实现二叉平衡树(A VL)旋转 _ LL/RR/LR/RL四种情况【源码】

LL/RR旋转的实现关键在更新高度和子树重连

LL 和 RR 是单旋转,核心动作是把失衡节点的子节点“提上来”做新根,原根降为子节点。容易漏掉的是:旋转后必须重新计算两个参与节点的高度,否则后续平衡判断会出错。

常见错误现象:getHeight() 没在旋转后调用,导致 getBalanceFactor() 返回错误值,后续插入/删除反复触发无效旋转。

  • LLRotate() 中,先保存 root->left 为 newRoot,再让 root->left = newRoot->right,最后 newRoot->right = root
  • 旋转完成后必须按顺序调用 updateHeight(root) 和 updateHeight(newRoot)(先子后父,或先父后子都可,但不能漏)
  • RR旋转逻辑对称,只是把 left 换成 right,其余结构完全一致

LR/RL旋转本质是两次单旋组合,不能直接交换指针

LR 不是“先L再R”的简单拼接——第一次旋转(L)后,原失衡节点的左子树已变,第二次旋转(R)的操作对象是它新的左孩子,不是原始节点。直接手写两层指针操作极易搞反顺序或漏更新高度。

使用场景:当 root 失衡且 root->left->right 高度更高时,必须用 LR;RL 同理,出现在 root->right->left 更高时。

  • LR 旋转应拆解为:root->left = RRRotate(root->left),再 LLRotate(root)(注意:第一次旋转返回新左子树,必须赋值回 root->left)
  • RL 旋转同理:root->right = LLRotate(root->right),再 RRRotate(root)
  • 每次单旋后都要更新对应节点高度,LR/RL 共需更新 3 个节点高度(两次单旋各2个,但中间节点重叠,实际是3个)

insert() 中触发旋转的位置决定修复范围

A VL 插入后从插入点向上回溯,一遇到失衡节点就旋转,然后立即返回,不再继续向上检查。这是因为一次旋转最多影响当前子树根的高度,其父节点的平衡因子变化是确定的——旋转后整棵子树高度不变(LL/RR)或减1(LR/RL),所以父节点不会因此新增失衡。

错误做法:旋转后继续递归更新祖先高度,或在旋转后还对 root->parent 做平衡检查。

  • 在 insert() 递归返回时,检查 getBalanceFactor(root),若绝对值 > 1,则调用对应旋转函数,并直接 return newRoot
  • 旋转函数返回新子树根,上层递归必须接收并赋值,例如:root = LRRotate(root)
  • 旋转后无需再调用 updateHeight() 对 root,因为旋转函数内部已处理

delete() 的平衡修复比 insert() 更复杂,需重复检查

删除可能导致某路径高度下降,进而使多个祖先连续失衡。与插入不同,一次旋转不能保证整条路径恢复平衡,必须在旋转后继续向上回溯检查。

典型坑:复用插入的旋转逻辑,删除后只修一层,结果树仍不平衡。

  • 删除后回溯时,每层都要计算平衡因子;一旦失衡,旋转得到新根,然后以该新根为起点,继续向上检查(不是返回,而是继续执行父节点的平衡逻辑)
  • LR/RL 在 delete 中间出现频率更高,因为删除常导致“短边更短”,触发异侧深子树补偿
  • 务必确认 updateHeight() 在每次旋转后、以及删除叶子/单子节点后都正确执行,否则高度链断裂

高度更新和旋转后指针归属是最容易被跳过的两步,尤其在 delete 场景下,少一次 updateHeight() 或漏接旋转返回值,整棵树的 getBalanceFactor() 就全乱了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 C++
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

C++类构造与析构函数详解
C++类构造与析构函数详解

C++类构造与析构函数详解 C++这门语言,可以说是从C语言这棵大树上衍生出的高级果实,如今的应用普及度有目共睹。作为一种静态类型的通用编程语言,它厉害的地方在于融合了多种编程哲学——无论是传统的面向过程,还是主流的面向对象,乃至数据抽象、泛型编程这些高级概念,它都能很好地支持。正因为这份卓越的扩展

C++中std::upper
C++中std::upper

C++中std::upper_bound用法解析 在C++标准模板库(STL)的算法工具箱里,upper_bound() 绝对算得上是一把精准的“探针”。它的核心任务很明确:在一个已经排好序的区间 [first, last) 内,帮你快速定位到第一个**严格大于**指定值 value 的那个元素。这

C++常对象与成员解析
C++常对象与成员解析

C++中“常”概念全景解析:从对象、成员到指针与引用 在C++的世界里,“常量性”是一个强大的保障机制。它不仅仅是一个const关键字那么简单,而是构建健壮、安全程序的重要基石。今天,我们就来系统梳理一下围绕“常”的一系列概念:常成员、常对象、常指针与常引用。理解它们,是写出高质量C++代码的关键一

c++如何将结构体写入SQLite数据库_对象关系映射方案【进阶】
c++如何将结构体写入SQLite数据库_对象关系映射方案【进阶】

直接用SQLiteCAPI绑定结构体需要手动处理字段展平与顺序对齐,ORM库虽省代码但存在隐式行为风险。小项目建议原生绑定,中大型项目可搭配编译期校验使用轻量ORM。绑定std::string需传指针与长度,注意生命周期;浮点字段比较需设误差范围。

什么是编程,学习编程的意义是?
什么是编程,学习编程的意义是?

编程是编写程序指令,让设备按意图运行,常用Python、C等语言或Scratch图形化编程。学习编程能跟上科技时代,锻炼自学与解决问题能力,提升逻辑思维,代表行动力,推动事物前进。各司其职,编程者尽本分。

编程是门艺术_是编程艺术吗?
编程是门艺术_是编程艺术吗?

编程被争论是否为艺术。从定义看,编程是技能表达,但并非所有编程都是应用开发。写代码如音乐、文章,有独特风格。好代码需耐心与逻辑能力。编程是艺术,但应用开发不等同于编程艺术。

【编程的感受】
【编程的感受】

很多人提起编程,总觉得这是一门“不起眼”的学问——不就是写写代码嘛,能有多深?但真走进去了才会发现,编程里头的门道,远比表面看上去要丰富得多。 学习编程的过程中,最容易卡住的往往是那些基础语法。就拿那个常见的 for 循环来说吧,刚开始时怎么都绕不过弯来:为什么这么写能循环?循环条件到底怎么控制?一

对于懂得编程的人来说,编程对你来说有什么乐趣?编程大概是什么感觉?
对于懂得编程的人来说,编程对你来说有什么乐趣?编程大概是什么感觉?

解决编程问题后的痛快、完成作品的成就感、获取知识的满足感,以及用代码实现简化生活的惊喜与踏实,这些是编程独有的乐趣,只有真正写代码的人才能体会其中的酸甜苦辣、惊喜与满足,令人回味无穷。

趣味编程:少儿编程思维的启蒙之旅
趣味编程:少儿编程思维的启蒙之旅

Scratch图形化编程以拖拽积木块方式启蒙少儿编程思维,无需记忆代码语法。通过素材库、即时反馈和社区协作,帮助孩子在创作中理解顺序执行、条件判断等核心概念,锻炼逻辑、创造力和问题解决能力。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Adobe Acrobat Pro macOS版
Adobe Acrobat Pro macOS版
Mac

Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

WINDOWS 更多
3ds max(3dmax)
3ds max(3dmax)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

PixTV 网页版
PixTV 网页版
Windows

PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

AutoCAD Windows版
AutoCAD Windows版
Windows

AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。