首页/数据结构/04-tree/平衡二叉树(AVL 树) 🔗 在 Obsidian 中打开
数据结构 · 树与二叉树

平衡二叉树(AVL 树)

难度 ★★★重要度 ★★ 考查频率 低 平衡二叉树旋转平衡因子408
速查
AVL 树是二叉排序树,且任意结点左右子树高度差(平衡因子 BF = h_L − h_R)的绝对值 ≤ 1。插入/删除后若失衡,通过LL / RR / LR / RL 四种旋转恢复平衡。

核心概念

平衡二叉树(AVL 树)是一种特殊的二叉排序树,由 Adelson-Velsky 和 Landis 提出。它的核心约束是:对树中每一个结点,其左子树高度与右子树高度之差的绝对值不超过 1。

平衡因子(Balance Factor)

定义结点 $v$ 的平衡因子 BF(v) = h_L(v) − h_R(v),其中 $h_L, h_R$ 分别为左右子树高度。AVL 树要求对所有结点 $|BF(v)| \le 1$。

直觉当插入使某结点 BF 变成 $+2$ 或 $-2$ 时,以该结点为根的子树“失衡”,需要旋转把高度降回去。

失衡的四种类型

类型触发形状旋转操作
LLBF=+2,且左孩子的 BF ≥ 0对失衡结点右单旋
RRBF=−2,且右孩子的 BF ≤ 0对失衡结点左单旋
LRBF=+2,且左孩子的 BF < 0先左后右双旋
RLBF=−2,且右孩子的 BF > 0先右后左双旋

四种旋转

LL(右单旋)

失衡结点 A 的左子树更高,且左孩子 B 的左子树更高(A−B−C 一条左链)。将 B 提为根,A 降为 B 的右孩子,原 B 的右子树变为 A 的左子树。

RR(左单旋)

失衡结点 A 的右子树更高,且右孩子 B 的右子树更高(A−B−C 右链)。将 B 提为根,A 降为 B 的左孩子。

LR(先左后右双旋)

失衡 A 的左孩子 B 的右子树更高(插入到 B 的右子树)。先对 B 左单旋,再对 A 右单旋。

RL(先右后左双旋)

失衡 A 的右孩子 B 的左子树更高。先对 B 右单旋,再对 A 左单旋。

口诀“哪边高就往相反方向转”:左高右旋(LL),右高左旋(RR);呈折线的用双旋。

插入示例

依次插入 3, 2, 1, 4, 5, 6, 7,观察旋转如何维持平衡:

  • 插入 3, 2:正常,无失衡。
  • 插入 1:在 3 的左孩子 2 的左,形成 LL,对 3 右单旋 → 根为 2(左 1 右 3)。
  • 插入 4:挂在 3 的右,正常。
  • 插入 5:在 3 的右、4 的右,形成 RR,对 3 左单旋 → 根为 4(左 3 右 5)。
  • 插入 6:在 4 的右、5 的右,RR,对 4 左单旋 → 根为 5(左 4 右 6)。此时全局根为 2,右子树为 5。
  • 插入 7:在 5 的右、6 的右,RR,对 5 左单旋 → 根为 6(左 5 右 7)。

最终 AVL 树:

4 2 6 1 3 5 7
图:插入 3,2,1,4,5,6,7 后最终的平衡二叉树(根为 4)。

关键性质

  • 含 $n$ 个结点的 AVL 树高度 $h$ 满足 $h < 1.44\log_2(n+2) - 0.328$,即高度 $O(\log n)$。
  • 查找、插入、删除的时间复杂度均为 $O(\log n)$
  • 插入/删除最多需要 $O(\log n)$ 次旋转(实际常数级)。
  • AVL 树比红黑树更“严”,查找更快,但插入删除旋转更多。

常见考法

题型① 给定插入序列,画出插入过程中每一步的 AVL 树;② 判断失衡类型并写出旋转方式;③ 给定一棵 AVL 树,求其高度/结点数的最值。

易错点

必记
  1. 失衡判断看的是插入路径上第一个 BF 变成 ±2 的祖先,不一定是被插结点。
  2. LR 与 RL 是双旋:先转孩子再转祖先,不能只做一次单旋。
  3. 旋转后整棵子树高度恢复到插入前,因此上层不会再失衡(最多一次调整)。
  4. 平衡因子是左高减右高,别记反符号。

核心结论

要点结论
平衡条件所有结点 $|BF| \le 1$
四种旋转LL 右单旋 / RR 左单旋 / LR 双旋 / RL 双旋
时间复杂度查找/插入/删除均为 $O(\log n)$
高度上界约 $1.44\log_2(n+2)$

记忆卡片

平衡因子怎么算?
BF = 左子树高 − 右子树高,AVL 要求 |BF| ≤ 1。
LL 失衡怎么转?
右单旋:把左孩子提为根。
LR 失衡怎么转?
先对左孩子左单旋,再对失衡结点右单旋。
AVL 高度上界?
约 1.44·log₂(n+2),保证 O(log n)。

交互动画 · 插入/删除与四种旋转

1 / 9 步 插入演示(默认)
依次插入 8,7,3,1,9,10,2,5,4,观察四种失衡与 LL/RR/LR/RL 旋转修复(结点下方小框为平衡因子 BF)。
图例:白=正常 · 橙=新结点 · 红=失衡点(BF±2) · 紫虚线=旋转涉及的结点 · 小框=BF(红=±2,黄=±1,灰=0)

相关知识点

binary-tree-traversal binary-search-tree b-tree-and-b-plus-tree complete-binary-tree-properties huffman-tree-and-encoding

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。