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

C++实现AVL树平衡旋转 _ 左右旋转逻辑代码实现【源码】

陌墨君_8089

陌墨君_8089

发布时间:2026-04-14 16:55:43

|

803人浏览过

|

来源于php中文网

原创

AVL树旋转必须返回新根节点,因二叉链表无父指针,调用方需用返回值重连子树;height函数对空节点须返回−1以保证平衡因子计算正确;四种失衡类型严格对应单旋或双旋,且判断条件中需包含等号。

c++实现avl树平衡旋转 _ 左右旋转逻辑代码实现【源码】

AVL树的平衡旋转不是“左右各写一个函数就行”,关键在旋转后要同步更新高度、修正父指针(如果用三叉链)、且单次旋转未必够——插入后可能需从插入点向上逐层检查并最多执行一次旋转。

为什么rotateLeft和rotateRight必须返回新根节点

AVL节点通常用二叉链表实现,没有父指针。旋转会改变子树根节点,上层调用处必须用返回值重新链接。比如插入右子树导致失衡,调用rotateLeft后,原父节点的right字段必须指向新根,否则链断裂。

常见错误:函数声明为void rotateLeft(Node* node),内部改了node->right和node->right->left,但调用方仍用旧指针,整棵子树丢失。

正确做法:

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

  • Node* rotateRight(Node* y):传入失衡节点y,返回旋转后的新根(即原y->left)
  • 调用后必须赋值:例如x->right = rotateLeft(x->right)
  • 旋转内所有指针重连完成后,立即调用updateHeight更新涉及节点的高度

getBalanceFactor的计算顺序与边界处理

平衡因子 = 左子树高度 − 右子树高度。很多实现直接写height(node->left) - height(node->right),但若node为nullptr,height必须返回−1(不是0),否则叶子节点平衡因子算成1而非0。

示例错误逻辑:

C++14
C++14

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

下载
int height(Node* n) { return n ? n->height : 0; } // ❌ 导致叶子节点 balance = 1−0 = 1

正确写法:

int height(Node* n) { return n ? n->height : -1; } // ✅ 叶子节点:0−0 = 0

因此getBalanceFactor应严格基于此定义,且不能省略空指针判断——哪怕你确定非空,编译器优化或调试路径也可能触发未定义行为。

四种失衡场景如何对应到旋转组合

AVL只存在四种失衡类型,由插入位置和当前节点平衡因子共同决定,不能凭感觉选旋转:

  • LL型:balance > 1 && getBalanceFactor(node->left) >= 0 → 单次rotateRight
  • RR型:balance right) → 单次<code>rotateLeft
  • LR型:balance > 1 && getBalanceFactor(node->left) → 先<code>rotateLeft(node->left),再rotateRight(node)
  • RL型:balance right) > 0 → 先rotateRight(node->right),再rotateLeft(node)

注意:>= 0和包含等于0的情况,因为插入可能让原本平衡的子树变+1或−1,仍属LL/RR;而<code>或<code>> 0才触发双旋。漏掉等号会导致部分失衡被忽略。

插入后updateHeight和平衡检查的调用时机

高度更新必须在旋转完成之后、向上回溯之前进行。典型错误是:在递归插入返回后立刻更新当前节点高度,再检查平衡——此时子树可能已失衡,但高度却是“失衡前”的值,导致getBalanceFactor误判。

正确流程(以递归插入为例):

  • 递归插入左/右子树
  • 更新当前节点height = 1 + max(height(left), height(right))
  • 计算balance = getBalanceFactor(this)
  • 根据balance和子节点balance决定是否旋转
  • 旋转后,新根高度已由旋转内updateHeight修正;原节点若被降级为子节点,其高度也在旋转中更新

最容易被忽略的一点:旋转函数内部必须更新所有涉及节点的高度(至少3个节点),且顺序不能错——先更新孙子,再更新子,最后更新当前节点,否则中间计算会出错。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

音述AI
音述AI Hot

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

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

火山引擎

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

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

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

DeepSeek

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

WorkBuddy

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

相关专题

更多
javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

179

2025.11.16

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

20

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

20

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

20

2026.11.06

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

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

40

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

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