跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

AVL 树原理与 C++ 实现:构建自平衡二叉搜索树

AVL 树是一种自平衡二叉搜索树,通过限制左右子树高度差不超过 1 来保证查找效率。文章介绍了 AVL 树的定义、平衡因子的计算方法及其取值范围的意义,并说明了在 C++ 实现中节点结构需包含父指针以便高效更新平衡状态。相比红黑树,AVL 树更严格,适合对查询性能要求极高的场景。

PgDevote发布于 2026/3/16更新于 2026/8/333 浏览
AVL 树原理与 C++ 实现:构建自平衡二叉搜索树

AVL 树概念

起源与定义

AVL 树是最早被发明的平衡二叉搜索树。它是一颗空树,或者满足以下性质的二叉搜索树:左右子树均为 AVL 树,且左右子树的高度差绝对值不超过 1。

这种结构通过严格控制高度来维持平衡。虽然 AVL 树无法像红黑树那样作为数据库存储索引的首选(因为旋转开销较大),但在对查找性能要求极高且插入频率适中的场景下,它依然非常有效。AVL 树遵循二叉搜索树的基本性质:根节点大于左子树所有节点,小于右子树所有节点。

AVL 树得名于其发明者 G. M. Adelson-Velsky 和 E. M. Landis,他们在 1962 年的论文《An algorithm for the organization of information》中首次提出了这一概念。

平衡因子

为了判断树是否平衡,我们需要引入平衡因子的概念。在 AVL 树中,每个节点的平衡因子定义为:

平衡因子 = 右子树高度 - 左子树高度

若一棵二叉搜索树是平衡的,则任意节点的平衡因子只能是 -1、0 或 1。如果某个节点的平衡因子绝对值超过 1,说明该节点失衡,需要通过旋转操作进行调整。

为什么允许 -1 或 1?

有些读者可能会疑惑,既然追求平衡,为何不强制平衡因子为 0?这是因为 AVL 树的设计目标是保持整体平衡,而非局部完美对称。当插入节点数为偶数时,很难保证每个节点的左右子树高度完全一致。允许平衡因子为 -1 或 1,能在保持树高 O(log n) 的同时,减少不必要的旋转操作,提升效率。

文章配图

AVL 树实现准备

节点结构设计

实现 AVL 树的第一步是定义节点结构。由于后续需要频繁进行键值对操作,我们通常使用 std::pair 来存储数据。此外,AVL 树属于三叉链表结构,除了左孩子和右孩子指针外,还需要一个指向父节点的指针。

存储父节点指针的主要原因是为了在旋转操作后,能够方便地向上回溯并更新平衡因子,避免每次都需要重新遍历整棵树来计算高度。

struct Node {
    std::pair<int, int> data; // 键值对
    int height;               // 节点高度
    int balanceFactor;        // 平衡因子
    Node* left;               // 左子节点
    Node* right;              // 右子节点
    Node* parent;             // 父节点
};

在实际编码中,我们可以将高度和平衡因子合并计算,但显式存储能简化逻辑。接下来我们将讨论如何在插入和删除操作中维护这些属性。

目录

  1. AVL 树概念
  2. 起源与定义
  3. 平衡因子
  4. 为什么允许 -1 或 1?
  5. AVL 树实现准备
  6. 节点结构设计
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 学习资源整理:工具、课程与实战指南
  • Python 使用 Pandas 自动化处理 Excel 数据教程
  • VSCode + Copilot AI 编程实战教程:从安装到 Agent 应用
  • C++26 契约编程:三种实现方式与最佳实践
  • VS Code GitHub Copilot 自定义模型 API 支持与搜索功能说明
  • Ghostty + Yazi + Lazygit 构建现代化终端开发工作流
  • LLaMA-Factory 安装与环境配置实战
  • 基于 YOLOv11 系列的电动自行车违规载人检测系统开发实践
  • 滑动窗口算法详解与实战
  • STL map/multimap 深度解析:接口使用与核心特性
  • Nano Banana 生成中文模糊?用 Seedream 4.5 重新渲染更清晰
  • 程序员入门大模型:2024 年畅销书单推荐
  • 数据结构:优先级队列 PriorityQueue
  • 《自然语言处理:大模型理论与实践》:大模型核心技术与实战指南
  • 使用 ZeroNews 远程管理 OpenClaw Gateway Dashboard
  • NLP 任务预训练模型选择与方案规范建议
  • 2026 年十大 AI 编程工具推荐
  • AI + 鸿蒙游戏,会成为下一个爆点吗?
  • HarmonyOS 6.0 应用预加载机制详解
  • VsCode 远程连接服务器后 GitHub Copilot 无法使用修复方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online