AVL树完整实现与深度解析

AVL树原理与C++完整实现(标准Markdown语法,可直接复制)

目录

### 文章目录

  • [AVL树原理与C++完整实现(标准Markdown语法,可直接复制)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [目录](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [@[toc]](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [一、AVL树核心原理](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [1.1 什么是AVL树](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [1.2 平衡因子(Balance Factor)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [1.3 四种失衡类型与旋转方案](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [二、AVL树节点结构设计](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [三、AVL树主体类定义](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [四、右单旋(RotateR)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [4.1 适用场景](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [4.2 实现代码](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [五、左单旋(RotateL)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [5.1 适用场景](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [5.2 实现代码](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [六、左右双旋(RotateLR)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [6.1 适用场景](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [6.2 实现代码](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [七、右左双旋(RotateRL)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [7.1 适用场景](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [7.2 实现代码](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [八、AVL树插入(Insert)](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [8.1 核心逻辑](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [8.2 完整实现代码](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [九、辅助功能实现](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [9.1 树高度计算](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [9.2 平衡验证](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [9.3 中序遍历](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [十、测试主函数](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [十一、代码运行说明](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [十二、AVL树核心总结](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [12.1 旋转规则](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [12.2 插入回溯规则](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [12.3 关键细节](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)
  • [十三、常见面试考点](#文章目录 AVL树原理与C++完整实现(标准Markdown语法,可直接复制) 目录 @[toc] 一、AVL树核心原理 1.1 什么是AVL树 1.2 平衡因子(Balance Factor) 1.3 四种失衡类型与旋转方案 二、AVL树节点结构设计 三、AVL树主体类定义 四、右单旋(RotateR) 4.1 适用场景 4.2 实现代码 五、左单旋(RotateL) 5.1 适用场景 5.2 实现代码 六、左右双旋(RotateLR) 6.1 适用场景 6.2 实现代码 七、右左双旋(RotateRL) 7.1 适用场景 7.2 实现代码 八、AVL树插入(Insert) 8.1 核心逻辑 8.2 完整实现代码 九、辅助功能实现 9.1 树高度计算 9.2 平衡验证 9.3 中序遍历 十、测试主函数 十一、代码运行说明 十二、AVL树核心总结 12.1 旋转规则 12.2 插入回溯规则 12.3 关键细节 十三、常见面试考点)

一、AVL树核心原理

1.1 什么是AVL树

AVL树是自平衡二叉搜索树,是最早被发明的平衡二叉树结构。

它的核心特点:

  • 继承二叉搜索树BST的全部性质
  • 任意节点的左右子树高度差绝对值 ≤ 1
  • 插入/删除后自动通过旋转恢复平衡
  • 查找、插入、删除时间复杂度稳定为 O(logN)

解决了普通二叉搜索树有序插入退化为链表的致命缺陷。

1.2 平衡因子(Balance Factor)

平衡因子是AVL树判断是否失衡的唯一依据:

复制代码
平衡因子 bf = 左子树高度 - 右子树高度

合法取值:

  • -1:右子树更高
  • 0:左右子树等高
  • 1:左子树更高

失衡判定:

  • 节点 bf = 2-2 → 必须旋转修复

1.3 四种失衡类型与旋转方案

失衡类型 判定条件 旋转方式
左左失衡(LL) parent->_bf = -2,cur->_bf = -1 右单旋
左右失衡(LR) parent->_bf = -2,cur->_bf = 1 左右双旋
右右失衡(RR) parent->_bf = 2,cur->_bf = 1 左单旋
右左失衡(RL) parent->_bf = 2,cur->_bf = -1 右左双旋

二、AVL树节点结构设计

cpp 复制代码
#pragma once
#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;

// AVL树节点结构
template<class K, class V>
struct AVLTreeNode
{
    // 键值对存储数据
    pair<K, V> _kv;
    // 左右孩子指针
    AVLTreeNode<K, V>* _left;
    AVLTreeNode<K, V>* _right;
    // 双亲指针,旋转与回溯核心
    AVLTreeNode<K, V>* _parent;
    // 平衡因子
    int _bf;

    // 构造函数
    AVLTreeNode(const pair<K, V>& kv)
        : _kv(kv)
        , _left(nullptr)
        , _right(nullptr)
        , _parent(nullptr)
        , _bf(0)
    {}
};

三、AVL树主体类定义

cpp 复制代码
template<class K, class V>
class AVLTree
{
    typedef AVLTreeNode<K, V> Node;

public:
    AVLTree()
        : _root(nullptr)
    {}

    // 插入接口
    bool Insert(const K& key, const V& value);
    // 右单旋
    void RotateR(Node* parent);
    // 左单旋
    void RotateL(Node* parent);
    // 左右双旋
    void RotateLR(Node* parent);
    // 右左双旋
    void RotateRL(Node* parent);
    // 求树高度
    int Height(Node* root);
    // 验证是否平衡
    bool IsBalance();
    bool _IsBalance(Node* root);
    // 中序遍历
    void InOrder();
    void _InOrder(Node* root);

private:
    Node* _root;
};

四、右单旋(RotateR)

4.1 适用场景

左左失衡(LL):节点左子树过高,左孩子的左子树过高。

4.2 实现代码

cpp 复制代码
template<class K, class V>
void AVLTree<K, V>::RotateR(Node* parent)
{
    // 定位关键节点
    Node* subL = parent->_left;
    Node* subLR = subL->_right;
    Node* pparent = parent->_parent;

    // 旋转结构调整
    parent->_left = subLR;
    subL->_right = parent;

    // 维护双亲指针
    if (subLR)
        subLR->_parent = parent;

    parent->_parent = subL;
    subL->_parent = pparent;

    // 根节点特殊处理
    if (_root == parent)
    {
        _root = subL;
        subL->_parent = nullptr;
    }
    else
    {
        if (pparent->_left == parent)
            pparent->_left = subL;
        else
            pparent->_right = subL;
    }

    // 平衡因子重置
    subL->_bf = parent->_bf = 0;
}

五、左单旋(RotateL)

5.1 适用场景

右右失衡(RR):节点右子树过高,右孩子的右子树过高。

5.2 实现代码

cpp 复制代码
template<class K, class V>
void AVLTree<K, V>::RotateL(Node* parent)
{
    // 定位关键节点
    Node* subR = parent->_right;
    Node* subRL = subR->_left;
    Node* pparent = parent->_parent;

    // 旋转结构调整
    parent->_right = subRL;
    subR->_left = parent;

    // 维护双亲指针
    if (subRL)
        subRL->_parent = parent;

    parent->_parent = subR;
    subR->_parent = pparent;

    // 根节点特殊处理
    if (_root == parent)
    {
        _root = subR;
        subR->_parent = nullptr;
    }
    else
    {
        if (pparent->_left == parent)
            pparent->_left = subR;
        else
            pparent->_right = subR;
    }

    // 平衡因子重置
    subR->_bf = parent->_bf = 0;
}

六、左右双旋(RotateLR)

6.1 适用场景

左右失衡(LR):节点左子树高,左孩子的右子树高。

6.2 实现代码

cpp 复制代码
template<class K, class V>
void AVLTree<K, V>::RotateLR(Node* parent)
{
    Node* subL = parent->_left;
    Node* subLR = subL->_right;
    // 保存原平衡因子,用于修正
    int bf = subLR->_bf;

    // 旋转顺序:先左单旋左孩子,再右单旋父节点
    RotateL(subL);
    RotateR(parent);

    // 修正平衡因子
    if (bf == -1)
    {
        subL->_bf = 0;
        subLR->_bf = 0;
        parent->_bf = 1;
    }
    else if (bf == 1)
    {
        subL->_bf = -1;
        subLR->_bf = 0;
        parent->_bf = 0;
    }
    else
    {
        subL->_bf = 0;
        subLR->_bf = 0;
        parent->_bf = 0;
    }
}

七、右左双旋(RotateRL)

7.1 适用场景

右左失衡(RL):节点右子树高,右孩子的左子树高。

7.2 实现代码

cpp 复制代码
template<class K, class V>
void AVLTree<K, V>::RotateRL(Node* parent)
{
    Node* subR = parent->_right;
    Node* subRL = subR->_left;
    // 保存原平衡因子,用于修正
    int bf = subRL->_bf;

    // 旋转顺序:先右单旋右孩子,再左单旋父节点
    RotateR(subR);
    RotateL(parent);

    // 修正平衡因子
    if (bf == -1)
    {
        subRL->_bf = 0;
        parent->_bf = 0;
        subR->_bf = 1;
    }
    else if (bf == 1)
    {
        subR->_bf = 0;
        subRL->_bf = 0;
        parent->_bf = -1;
    }
    else
    {
        subRL->_bf = 0;
        parent->_bf = 0;
        subR->_bf = 0;
    }
}

八、AVL树插入(Insert)

8.1 核心逻辑

  1. 按照BST规则找到插入位置
  2. 插入新节点并维护双亲指针
  3. 向上回溯更新平衡因子
  4. 失衡则执行对应旋转
  5. 旋转后树恢复平衡,终止回溯

8.2 完整实现代码

cpp 复制代码
template<class K, class V>
bool AVLTree<K, V>::Insert(const K& key, const V& value)
{
    // 空树直接创建根节点
    if (_root == nullptr)
    {
        _root = new Node(make_pair(key, value));
        return true;
    }

    // 查找插入位置
    Node* parent = nullptr;
    Node* cur = _root;
    while (cur)
    {
        if (key > cur->_kv.first)
        {
            parent = cur;
            cur = cur->_right;
        }
        else if (key < cur->_kv.first)
        {
            parent = cur;
            cur = cur->_left;
        }
        else
        {
            // 键值重复,插入失败
            return false;
        }
    }

    // 链接新节点
    Node* newnode = new Node(make_pair(key, value));
    if (key > parent->_kv.first)
    {
        parent->_right = newnode;
        newnode->_parent = parent;
    }
    else
    {
        parent->_left = newnode;
        newnode->_parent = parent;
    }

    // 回溯更新平衡因子 + 旋转调整
    cur = newnode;
    while (parent)
    {
        // 左插 bf--,右插 bf++
        if (parent->_left == cur)
            parent->_bf--;
        else
            parent->_bf++;

        // 平衡因子为0,高度不变,停止更新
        if (parent->_bf == 0)
        {
            break;
        }
        // 平衡因子±1,高度变化,继续向上
        else if (abs(parent->_bf) == 1)
        {
            cur = parent;
            parent = parent->_parent;
        }
        // 平衡因子±2,失衡,旋转修复
        else if (abs(parent->_bf) == 2)
        {
            if (parent->_bf == -2 && cur->_bf == -1)
            {
                RotateR(parent);
            }
            else if (parent->_bf == -2 && cur->_bf == 1)
            {
                RotateLR(parent);
            }
            else if (parent->_bf == 2 && cur->_bf == 1)
            {
                RotateL(parent);
            }
            else if (parent->_bf == 2 && cur->_bf == -1)
            {
                RotateRL(parent);
            }
            // 旋转后平衡,退出循环
            break;
        }
    }
    return true;
}

九、辅助功能实现

9.1 树高度计算

cpp 复制代码
template<class K, class V>
int AVLTree<K, V>::Height(Node* root)
{
    if (root == nullptr)
        return 0;
    int leftH = Height(root->_left);
    int rightH = Height(root->_right);
    return max(leftH, rightH) + 1;
}

9.2 平衡验证

cpp 复制代码
template<class K, class V>
bool AVLTree<K, V>::_IsBalance(Node* root)
{
    if (root == nullptr)
        return true;

    int leftH = Height(root->_left);
    int rightH = Height(root->_right);

    // 检查平衡因子是否正确
    if (abs(leftH - rightH) > 1)
    {
        cout << "节点失衡:" << root->_kv.first << endl;
        return false;
    }
    if (root->_bf != leftH - rightH)
    {
        cout << "平衡因子错误:" << root->_kv.first << endl;
        return false;
    }

    return _IsBalance(root->_left) && _IsBalance(root->_right);
}

template<class K, class V>
bool AVLTree<K, V>::IsBalance()
{
    return _IsBalance(_root);
}

9.3 中序遍历

cpp 复制代码
template<class K, class V>
void AVLTree<K, V>::_InOrder(Node* root)
{
    if (root == nullptr)
        return;
    _InOrder(root->_left);
    cout << root->_kv.first << " ";
    _InOrder(root->_right);
}

template<class K, class V>
void AVLTree<K, V>::InOrder()
{
    _InOrder(_root);
    cout << endl;
}

十、测试主函数

cpp 复制代码
int main()
{
    AVLTree<int, int> t;
    // 测试用例:有序插入,检验平衡效果
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    for (auto e : a)
    {
        t.Insert(e, e);
    }

    // 中序遍历(必须有序)
    cout << "中序遍历:";
    t.InOrder();

    // 验证是否平衡
    cout << "是否平衡:" << (t.IsBalance() ? "是" : "否") << endl;

    return 0;
}

十一、代码运行说明

  1. 全部代码可直接复制,保存为 AVLTree.cpp
  2. 使用VS/G++/Clang直接编译运行
  3. 中序遍历结果一定是升序序列
  4. IsBalance() 必须返回 true,否则实现错误

十二、AVL树核心总结

12.1 旋转规则

  • 左左 → 右单旋
  • 右右 → 左单旋
  • 左右 → 先左后右双旋
  • 右左 → 先右后左双旋

12.2 插入回溯规则

  • bf = 0 → 停止回溯
  • bf = ±1 → 继续向上
  • bf = ±2 → 旋转 + 终止

12.3 关键细节

  • 双亲指针必须双向维护
  • 双旋必须保存中间节点平衡因子
  • 旋转后必须更新根节点指针
  • 旋转完成必须break退出循环

十三、常见面试考点

  1. AVL树与红黑树的区别
  2. 四种失衡场景与旋转方式
  3. 平衡因子的计算与更新
  4. 旋转的时间复杂度
  5. AVL树的应用场景
  6. 双亲指针的作用
相关推荐
吃好睡好便好6 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue9 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路10 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星10 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑10 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光11 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩11 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947311 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ12 小时前
单词拆分----dp
算法