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

C++实现平衡二叉树AVL的左右旋转 _ 维持树平衡的核心算法代码【源码】

夏辰君_6226

夏辰君_6226

发布时间:2026-05-01 18:42:29

|

171人浏览过

|

来源于php中文网

原创

AVL树左旋触发条件是节点BF=-2且右子节点BF=-1(RR型),右旋是BF=2且左子节点BF=1(LL型);LR/RL型需先对子节点反向旋转再对当前节点同向旋转。

c++实现平衡二叉树avl的左右旋转 _ 维持树平衡的核心算法代码【源码】

AVL树左旋和右旋的触发条件是什么

左旋(rotateLeft)发生在右子树过高,且失衡节点的右子节点的右子树更重(RR型);右旋(rotateRight)发生在左子树过高,且失衡节点的左子节点的左子树更重(LL型)。关键不是“高度差=2”就立刻旋转,而是要结合**平衡因子(BF = height(left) - height(right))**判断:当某节点bf == -2且其右子节点bf == -1时,才做左旋;bf == 2且其左子节点bf == 1时,才做右旋。

容易忽略的是:LL/RR只是基础情形,还有LR/RL型——这时不能直接单旋,必须先对子节点做一次反向旋转,再对当前节点同向旋转。比如LR型:先对左子节点rotateLeft,再对当前节点rotateRight。

左右旋代码里最容易写错的指针更新顺序

旋转本质是局部子树结构重连,核心是三步:暂存关键子节点 → 更新父指针 → 修正高度。常见错误是顺序颠倒导致指针悬空或循环引用。

  • rotateRight中,必须先保存node->left->right(即B的右子树),再把node->left提到根位置,最后把原node挂到新根的右子树上
  • 更新height必须在子树结构稳定后进行,否则getHeight(node->left)可能读到未同步的高度值
  • 如果用递归方式维护高度,务必在旋转后立即调用updateHeight(node)和updateHeight(newRoot),顺序不能反
Node* rotateRight(Node* node) {
    Node* newRoot = node->left;
    Node* temp = newRoot->right;  // 先存B的右子树
    newRoot->right = node;         // B的右指针指向A
    node->left = temp;             // A的左指针指向temp
    updateHeight(node);            // 先更新子节点高度
    updateHeight(newRoot);         // 再更新新根高度
    return newRoot;
}

为什么插入后要从下往上回溯检查并旋转

AVL插入是递归向下找位置,但平衡修复必须自底向上——因为只有插入路径上的节点才可能失衡,且高层节点的平衡因子依赖于子树高度,必须等子树旋转完成、高度更新后才能重新计算。

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

C++14
C++14

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

下载

典型错误是“一发现bf == 2就立刻旋完返回”,这会中断回溯,导致祖先节点高度没更新、BF计算错误,后续可能漏修复或误修复。

  • 每次递归返回时,都要调用updateHeight和getBalanceFactor
  • 根据当前节点BF值决定是否旋转,并把旋转后的子树根作为返回值传给上层
  • 单旋后该节点平衡,但上层仍可能失衡,所以不能提前return,必须继续回溯

insert函数里如何统一处理四种失衡类型

不建议用一堆if-else硬编码判断LL/LR/RR/RL——逻辑易错且难维护。推荐先算出当前节点BF和左右子节点BF,再用组合判断:

  • 若bf == 2 && getBalanceFactor(node->left) >= 0 → LL型 → rotateRight
  • 若bf == 2 && getBalanceFactor(node->left) < 0 → LR型 → 先rotateLeft(node->left),再rotateRight(node)
  • 若bf == -2 && getBalanceFactor(node->right) <= 0 → RR型 → rotateLeft
  • 若bf == -2 && getBalanceFactor(node->right) > 0 → RL型 → 先rotateRight(node->right),再rotateLeft(node)

注意>= 0和<= 0的边界处理:LL/RR要求子节点BF同号,而LR/RL要求异号;用>=而非== 1能兼容插入后子节点BF为0的情况(即刚插入叶节点,子树尚平衡)。

高度更新和BF计算看似简单,但一旦和递归插入、多层旋转耦合,就很容易在某个回溯层级漏掉updateHeight,或者在LR/RL型中忘了把第一次旋转的结果赋回给node->left或node->right。这些细节不报错,但会导致树逐渐退化成链表。

热门AI工具

更多
DeepSeek

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

切问学术

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

豆包大模型

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

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

Loomy
Loomy Hot

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

讯飞智作

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

相关专题

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

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

2248

2024.03.14

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

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

1019

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++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

406

2024.03.14

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

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

580

2024.03.14

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

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

1409

2024.03.21

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

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

1217

2024.03.22

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

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