06-AVL / 红黑树

type
status
date
slug
summary
tags
category
icon
password
 
AVL树红黑树(Red-Black Tree)都是为了解决二叉搜索树在插入/删除时可能失衡的问题所设计的自平衡二叉搜索树(Self-Balancing BST),但它们的设计哲学、性能折中和实现细节不同。

1️⃣ AVL树(Adelson-Velsky and Landis Tree)

✅ 特点
  • 每个节点记录平衡因子(左右子树高度差)
  • 任意节点的左右子树高度差不超过1
  • 插入/删除后可能需要多次旋转来恢复平衡
🧮 平衡因子
  • balanceFactor = height(left) - height(right)
  • 平衡因子 ∈ {-1, 0, 1}
🔄 旋转操作
  • LL:右旋
  • RR:左旋
  • LR:先左旋后右旋
  • RL:先右旋后左旋
🕹️ 适用场景
  • 频繁查询(AVL 树更“严格平衡”)
  • 数据变化不频繁的查找密集型场景

2️⃣ 红黑树(Red-Black Tree)

✅ 特点
  • 每个节点额外有一个颜色属性(红或黑)
  • 满足红黑五大性质(见下)
  • 插入/删除后通过变色+旋转维持平衡,最多旋转一次
🧮 红黑树性质(重点)
  1. 每个节点非红即黑
  1. 根节点是黑色
  1. 每个叶子节点(NIL)是黑色
  1. 红色节点不能连续(不能有两个连续的红节点)
  1. 从任一节点到其所有叶子路径上的黑节点数相同
上述性质确保了:最坏高度 ≤
若某条路径的黑色节点数为bh,那么总高度最多是:
红黑树中,黑高为 bh的最少节点数为:
因此:
这就是红黑树的最坏高度上限
  1. 插入新节点:默认颜色为红色
  1. 若违反红黑性质(如出现红红),则需做:
      • 颜色变换
      • 左旋 / 右旋 / 双旋
  1. 最后确保根节点为黑色
🔄 平衡手段
  • 插入:变色 + 旋转(最多一次)
  • 删除:变色 + 多次旋转或递归调整
🕹️ 适用场景
  • 插入/删除频繁,读写均衡(如 TreeMap/TreeSet)
  • 红黑树在工业场景中比 AVL 更常用(如 Java 的 TreeMap、Linux内核)

3️⃣ AVL 与 红黑树对比总结

对比项
AVL树
红黑树
平衡性
严格平衡,高度更低
相对平衡,高度略高
插入/删除效率
可能多次旋转,较慢
最多一次旋转,效率更高
查询效率
更快(因为高度更低)
稍慢
应用场景
读多写少
读写均衡
典型应用
内存索引、少量变动的大数据查询
Java TreeMap、Linux调度等
  • AVL 树 更适合查找频繁、更新少的场景
  • 红黑树 更适合高并发、频繁插入/删除的业务场景,是工业应用的主力
 
上一篇
05-二叉树
下一篇
07-图
Loading...