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

C++ 实现二叉平衡树 AVL 的节点合并与分裂算法维护逻辑【源码】

浅磊姑娘_7423

浅磊姑娘_7423

发布时间:2026-05-19 20:32:56

|

1024人浏览过

|

来源于php中文网

原创

AVL树合并与分裂需同步更新高度和平衡因子、正确触发四种旋转、递归或迭代修复祖先节点。具体包括:基于高度差的分裂旋转、自底向上合并、栈式路径修正、惰性标记延迟平衡。

c++ 实现二叉平衡树 avl 的节点合并与分裂算法维护逻辑【源码】

如果您在实现 C++ 中 AVL 树的节点合并与分裂操作时发现高度失衡、旋转逻辑异常或子树结构错乱,则可能是由于合并与分裂过程中未同步更新平衡因子、未正确触发四种旋转、或未递归修复路径上所有祖先节点的高度与平衡状态。以下是实现该维护逻辑的具体方法:

一、基于高度差触发的分裂操作

分裂操作适用于某节点的左右子树高度差绝对值超过 1 且该节点本身为“过载根”,需将其拆分为两个独立 AVL 子树,同时保留中序遍历顺序。分裂必须从待处理节点开始向上回溯修正高度与平衡因子,并在必要时执行旋转。

1、计算当前节点左子树与右子树的高度差:int bf = getHeight(node->left) - getHeight(node->right)。

2、若 bf > 1 && getHeight(node->left->left) >= getHeight(node->left->right),执行右单旋(LL型),并将原节点设为右旋后的新右子树根。

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

3、若 bf > 1 && getHeight(node->left->right) > getHeight(node->left->left),先对 node->left 执行左单旋,再对 node 执行右单旋(LR型)。

4、若 bf right->right) >= getHeight(node->right->left),执行左单旋(RR型)。

5、若 bf right->left) > getHeight(node->right->right),先对 node->right 执行右单旋,再对 node 执行左单旋(RL型)。

6、完成旋转后,调用 updateHeightAndBF(node) 更新当前节点及其子节点的高度与平衡因子。

二、自底向上递归的合并操作

合并操作将两棵 AVL 树 T1 和 T2 与一个中间键值 key 合并为一棵新 AVL 树,要求 T1 中所有键小于 key,T2 中所有键大于 key。关键在于选取合适根节点并维持整条插入路径的平衡性,避免逐层重复调整。

1、构造临时节点 newRoot = new AVLNode(key),将其左指针指向 T1 的根,右指针指向 T2 的根。

2、调用 recomputeHeightAndBF(newRoot) 计算 newRoot 高度与平衡因子,不立即旋转。

3、沿 newRoot 向上回溯至两棵树的最近公共祖先位置,对路径上每个节点执行 balanceNode(node) 函数,该函数内部封装了全部四种旋转判断与执行逻辑。

4、若某祖先节点触发旋转,旋转后须重新设置其父节点对应子指针,并继续向上检查父节点是否仍失衡。

C++14
C++14

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

下载

5、最终返回经完整路径平衡后的根节点,确保整棵树满足 AVL 性质。

三、非递归路径修正的分裂-合并混合策略

当需频繁执行合并与分裂(如区间 AVL 树或持久化 AVL 场景),递归回溯开销显著。此策略改用栈显式保存从操作节点到根的路径,逐层弹出并校验平衡状态,避免函数调用栈深度限制与重复访问。

1、初始化空栈 std::stack pathStack,从待处理节点开始,沿 parent 指针向上压栈直至根节点。

2、弹出栈顶节点 node,执行 updateHeightAndBF(node),再计算其平衡因子。

3、若 abs(node->bf) > 1,根据左右子树高度关系选择对应旋转类型,并更新 node 及其子节点指针。

4、若发生旋转,新生成的子树根可能改变,需将该新根重新接入其原父节点对应侧,并将父节点再次压入栈中以重新校验。

5、重复步骤 2–4 直至栈为空。

四、惰性标记驱动的延迟平衡机制

针对高吞吐批量合并/分裂场景,可引入惰性标记字段 bool needsRebalance,仅在节点子树高度变化且当前 bf 绝对值达临界阈值(如 |bf| == 2)时置位,推迟实际旋转至下一次访问该节点路径时统一处理,降低即时计算压力。

1、每次插入、删除、合并或分裂导致子树高度变更后,设置 node->needsRebalance = (abs(node->bf) == 2)。

2、在 find、get 等只读操作中,若沿路径遇到 needsRebalance == true 的节点,则立即执行 balanceNode 并清除标记。

3、在合并入口函数中增加预检:遍历 T1 最右路径与 T2 最左路径,对所有 needsRebalance == true 的节点提前执行 balanceNode。

4、所有旋转函数内部均需同步更新被旋转节点及其新子节点的 needsRebalance 标记状态。

5、updateHeightAndBF 函数末尾添加逻辑:若更新后 abs(node->bf) == 2,则设 node->needsRebalance = true。

热门AI工具

更多
Loomy
Loomy Hot

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

豆包大模型

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

WorkBuddy

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

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

2288

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语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

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

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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