讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 实现平衡二叉树 AVL 的节点删除平衡修复 _ 逻辑【源码】

老敏君_7947

老敏君_7947

发布时间:2026-05-24 17:53:27

|

502人浏览过

|

来源于php中文网

原创

AVL树删除后需自底向上修复失衡:从父节点回溯,对首个平衡因子为±2的节点按LL/LR/RR/RL类型执行单旋或双旋,并严格更新涉及节点高度。

c++ 实现平衡二叉树 avl 的节点删除平衡修复 _ 逻辑【源码】

一、理解 AVL 树删除后的失衡类型与旋转触发条件

在 AVL 树中删除一个节点后,从被删节点的父节点开始向上回溯至根节点,途中每个祖先节点的平衡因子可能变为 -2 或 2,表明该子树失衡。失衡共分四种情形:LL(左左)、LR(左右)、RR(右右)、RL(右左),分别对应需执行单右旋、先左后右双旋、单左旋、先右后左双旋。修复必须沿回溯路径对首个失衡节点立即处理,且修复后需更新其高度并继续向上检查父节点是否仍失衡。

1、计算节点高度:若节点为空,高度为 -1;否则为 max(左子树高度, 右子树高度) + 1。

2、计算平衡因子:节点的平衡因子 = 左子树高度 - 右子树高度。

3、识别失衡类型:对当前失衡节点 N,若左子节点 L 的平衡因子 ≥ 0,则为 LL 型;若 L 的平衡因子 0,则为 RL 型。

立即学习“C++免费学习笔记(深入)”;

二、实现单右旋(Right Rotation)用于 LL 失衡

单右旋将失衡节点 N 的左子节点 L 提升为新子树根,N 成为 L 的右子节点;L 原有的右子树(若存在)转为 N 的左子树。该操作保持中序遍历不变,并恢复 N 所在子树的 AVL 性质。

1、保存 L = N->left。

2、将 N->left 设置为 L->right。

3、将 L->right 设置为 N。

4、依次更新 N 和 L 的高度:先更新 N(因其子树已变),再更新 L。

5、返回 L 作为该子树新的根节点。

三、实现单左旋(Left Rotation)用于 RR 失衡

单左旋将失衡节点 N 的右子节点 R 提升为新子树根,N 成为 R 的左子节点;R 原有的左子树(若存在)转为 N 的右子树。该操作同样维持中序顺序,并修正高度关系。

1、保存 R = N->right。

2、将 N->right 设置为 R->left。

3、将 R->left 设置为 N。

4、依次更新 N 和 R 的高度:先更新 N,再更新 R。

5、返回 R 作为该子树新的根节点。

四、实现先左后右双旋(LR Rotation)用于 LR 失衡

LR 失衡需先对 N 的左子节点 L 执行左旋,使其右子节点成为新的左子根,再对 N 执行右旋。该组合确保旋转后子树高度差重归 [-1, 1] 区间,且结构满足 BST 性质。

1、对 N->left 执行左旋,得到新左子节点 L_new。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

2、将 N->left 设置为 L_new。

3、对 N 执行右旋。

4、返回右旋后的子树根节点。

五、实现先右后左双旋(RL Rotation)用于 RL 失衡

RL 失衡需先对 N 的右子节点 R 执行右旋,使其左子节点成为新的右子根,再对 N 执行左旋。该过程同步维护 BST 顺序与 AVL 高度约束。

1、对 N->right 执行右旋,得到新右子节点 R_new。

2、将 N->right 设置为 R_new。

3、对 N 执行左旋。

4、返回左旋后的子树根节点。

六、编写删除后自底向上平衡修复主逻辑

删除操作本身按 BST 规则进行:若节点有两个子节点,用中序后继替换并递归删除后继;否则用唯一子节点或空节点替代。删除完成后,在递归返回路径上逐层调用平衡修复函数。每次修复后必须重新计算当前节点高度,再判断是否需旋转。

1、若当前节点为空,直接返回空指针。

2、根据待删值与当前节点值比较,递归进入左子树或右子树执行删除。

3、递归返回后,重新计算当前节点高度。

4、计算当前节点平衡因子,若绝对值大于 1,则根据子节点平衡因子判定失衡类型并执行对应旋转。

5、返回经旋转或未旋转后的当前子树根节点。

七、关键修复点:旋转后必须强制更新涉及节点的高度

所有旋转操作均会改变参与旋转节点的子树结构,因此每次旋转结束后,必须显式调用 updateHeight() 更新旋转中涉及的每一个节点的高度,否则后续平衡因子计算将失效。未更新高度将导致上层节点误判是否失衡,引发修复遗漏或错误旋转。

1、定义 updateHeight(Node* n) 函数:若 n 非空,则 n->height = 1 + max(getHeight(n->left), getHeight(n->right))。

2、在单右旋中,先 updateHeight(N),再 updateHeight(L)。

3、在单左旋中,先 updateHeight(N),再 updateHeight(R)。

4、在双旋中,每次单旋内部已包含对应 updateHeight 调用,外层无需重复,但最终返回前需确保新根高度正确。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2268

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn