文章目录
基于可视化方法分析红黑树的插入/删除流程
📥 一、红黑树插入操作
1️⃣ 插入流程总览
红黑树插入 = 二叉搜索树插入 + 插入后修复(保持5大性质)
插入过程步骤:
- 插入新节点为红色;
- 普通 BST 插入;
- 检查是否破坏红黑树性质;
- 修复:通过旋转和着色恢复红黑树性质。
2️⃣ 插入示意图与三种场景
✅ 示例结构(插入前):
10(B)
/
5(R)
➕ 插入 1(红色)
10(B)
/
5(R)
/
1(R)
违背性质:5 连续红色节点出现了
📚 修复场景分类(插入)
场景 | 条件 | 修复操作 |
---|---|---|
情况 1:叔红 | 父红 + 叔红 | 父、叔变黑,祖父变红,递归上移 |
情况 2:叔黑,当前是“内拐” | 父红 + 当前是左-右或右-左 | 将其变为“外拐”,旋转父节点 |
情况 3:叔黑,当前是“外拐” | 父红 + 当前是左-左或右-右 | 父变黑,祖父变红,旋转祖父节点 |
🧠 插入情况图解
🔴 情况 1:父红 + 叔红
G(B) G(R)
/ \ => / \
P(R) U(R) P(B) U(B)
/
N(R)
- G: 祖父
- P: 父
- U: 叔
- N: 新节点
➡️ 颜色翻转,向上继续修复
🔁 情况 2:父红 + 叔黑 + 内拐
G(B) G(B) G(B)
/ / /
P(R) N(R) N(R)
\ => / => /
N(R) P(R) P(B)
/
NULL
➡️ 先旋转父节点,把内拐变外拐,再进入情况 3
🔁 情况 3:父红 + 叔黑 + 外拐
G(B) P(B)
/ => / \
P(R) N(R) G(R)
/
N(R)
➡️ 单旋 + 着色即可修复
📤 二、红黑树删除操作
红黑树删除更复杂,因为:
- 删除红节点:无需额外处理;
- 删除黑节点:可能破坏“黑高一致性”,需要复杂修复。
1️⃣ 删除基本流程
-
按 BST 方式删除节点(含替换节点);
-
如果删除的是红色节点:无需修复;
-
如果删除的是黑色节点:
- 需要修复黑色平衡;
- 引入“额外黑”,进行兄弟场景分类处理。
2️⃣ 删除修复场景分类
场景 | 条件 | 修复方法 |
---|---|---|
情况 1:兄弟红 | 父黑 + 兄弟红 | 旋转兄弟上移(变黑),转化为其他情况 |
情况 2:兄弟黑且兄弟子黑 | 兄弟为黑,兄弟左右子都黑 | 兄弟变红,额外黑传给父节点 |
情况 3:兄弟黑 + 兄弟“内侧”子红 | 转为情况4前的预处理 | 旋转兄弟,变成“外侧”红子 |
情况 4:兄弟黑 + 兄弟“外侧”子红 | 父子重新染色 + 单旋转修复 |
🧠 删除图解
🔴 情况 1:兄弟红(先旋转换色)
P(B) S(B)
/ \ => / \
N S(R) P(R) SR
/ \ / \
SL SR N SL
➡️ S 旋转上来,把红兄弟转为黑兄弟(继续向下修复)
🟢 情况 2:兄弟黑 + 子黑
P(B) P(B)
/ \ => / \
N S(B) N S(R)
/ \
BL BR
➡️ S 染红,P 继续下沉额外黑
✅ 插入 vs 删除 对比总结
对象 | 插入 | 删除 |
---|---|---|
默认颜色 | 新节点红 | 删除后黑缺失(额外黑) |
主要破坏 | 连续红 | 黑高失衡 |
修复方式 | 父变黑 / 祖父旋转 | 兄弟染色 / 多重旋转 |
旋转位置 | 祖父 | 父或兄弟 |
是否递归 | 可能 | 可能 |