红黑树是一种自平衡二叉搜索树 ,通过节点着色(红/黑)和旋转规则,保证最长路径≤2×最短路径 ,使增删查稳定在 O(log n)。
一、五大性质
- 节点非红即黑。
- 根节点为黑。
- 所有叶子(NIL空节点)为黑。
- 红节点的子节点必为黑(无连续红节点)。
- 任意节点到其所有后代NIL的路径上,黑节点数量相同(黑高一致)。
二、核心推论
- 最长路径(红黑交替)≤ 最短路径(全黑)×2 → 树高平衡、无退化。
- 插入最多2次旋转 ,删除最多3次旋转,比AVL树平衡更宽松、修改更快。
三、基本操作
1. 插入(新节点默认红色)
- 按BST规则插入,新节点设为红色(不破坏黑高)。
- 修复规则4(父红则冲突):
- 情况1:叔节点红 → 父、叔变黑,祖父变红,向上递归。
- 情况2:叔黑、当前是右孩子 → 左旋父节点,转为情况3。
- 情况3:叔黑、当前是左孩子 → 右旋祖父,父变黑、祖父变红。
2. 删除
- 按BST删除,用后继节点替代;删黑节点会破坏黑高,需修复。
- 修复"双黑"(路径缺1黑):
- 情况1:兄弟红 → 兄弟变黑、父变红,旋转父节点,转情况2/3/4。
- 情况2:兄弟黑、两侄黑 → 兄弟变红,双黑上移至父。
- 情况3:兄弟黑、左侄红、右侄黑 → 右旋兄弟,左侄变黑,转情况4。
- 情况4:兄弟黑、右侄红 → 旋转父,兄弟继承父色,父变黑、右侄变黑,结束。
3. 旋转(保持BST有序)
-
左旋:以x为轴,右孩子y上浮,y左子树转给x。
-
右旋:以x为轴,左孩子y上浮,y右子树转给x。
四、与AVL树对比
| 维度 | 红黑树 | AVL树 |
|---|---|---|
| 平衡严格度 | 宽松(最长≤2×最短) | 严格(高度差≤1) |
| 旋转次数 | 少(插2删3) | 多(删可能多次) |
| 适用场景 | 频繁增删(Java TreeMap、C++ map) | 查询密集 |
五、典型应用
- Java:
TreeMap、TreeSet、HashMap链表转红黑树。 - C++:
std::map、std::set。 - Linux 内核:进程调度、内存管理。
- 数据库:索引结构优化。