【C/C++】可视化解析红黑树插入与删除全流程

基于可视化方法分析红黑树的插入/删除流程


📥 一、红黑树插入操作

1️⃣ 插入流程总览

红黑树插入 = 二叉搜索树插入 + 插入后修复(保持5大性质)

插入过程步骤:

  1. 插入新节点为红色
  2. 普通 BST 插入;
  3. 检查是否破坏红黑树性质;
  4. 修复:通过旋转和着色恢复红黑树性质。

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️⃣ 删除基本流程

  1. 按 BST 方式删除节点(含替换节点);

  2. 如果删除的是红色节点:无需修复;

  3. 如果删除的是黑色节点

    • 需要修复黑色平衡;
    • 引入“额外黑”,进行兄弟场景分类处理。

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 删除 对比总结

对象插入删除
默认颜色新节点红删除后黑缺失(额外黑)
主要破坏连续红黑高失衡
修复方式父变黑 / 祖父旋转兄弟染色 / 多重旋转
旋转位置祖父父或兄弟
是否递归可能可能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值