红黑树删除需维持五性质,流程包括:1.用后继覆盖双子节点;2.单子节点直接替换并记录原色;3.双黑时按兄弟及侄节点颜色分四类修复;4.旋转同步更新指针与颜色;5.NIL节点统一处理。

一、红黑树节点删除的基本流程与约束条件
当从红黑树中删除一个节点时,需维持其五条基本性质:节点为红色或黑色;根节点为黑色;所有叶子(NIL)为黑色;红色节点的子节点必须为黑色;任意节点到其每个叶子的所有路径上包含相同数目的黑节点。若直接删除导致性质破坏,需通过颜色调整与旋转恢复平衡。以下是具体实现步骤:
1、定位待删除节点,若该节点有两个非空子节点,则用其后继节点(右子树最左节点)覆盖其值,并将操作转向删除后继节点。
2、若待删除节点至多有一个非空子节点,则用该子节点替代其位置,并记录被删节点的原始颜色。
3、若被删节点为黑色且替代节点为黑色(或为NIL),则触发双黑修复过程,需向上回溯调整。
立即学习“C++免费学习笔记(深入)”;
二、后继节点查找与值替换的实现逻辑
后继节点是中序遍历中紧邻当前节点的下一个节点,在红黑树中即为其右子树的最左后代。该节点至多有一个右子节点,因此可安全替换而不破坏结构。替换仅涉及键值与卫星数据拷贝,不改变指针拓扑关系。
1、从待删节点的右子节点开始,沿left指针持续向下遍历直至left为nullptr。
2、将后继节点的key、value及color字段逐字段复制到待删节点对应字段中。
3、将后继节点的父指针更新为其原父节点的left或right指针所指向的位置。
4、若后继节点有右子节点,则将其右子节点的parent指针设为后继节点的原父节点,并挂接到对应侧。
三、双黑情形下的修复算法分支处理
当被删黑色节点由黑色子节点(或NIL)替代后,该位置产生“双黑”语义——即路径上黑高减少1。修复需依据兄弟节点颜色、兄弟子节点颜色及结构形态分四类处理,每类均以旋转与 recoloring 组合完成局部修正。
1、若兄弟节点为红色,则必有黑色子节点;先对父节点执行左旋(若兄弟在右侧)并交换父与兄弟颜色,转化为兄弟为黑的情形。
2、若兄弟为黑色且其两个子节点均为黑色,则将兄弟染红,将当前节点上移至父节点继续处理。
3、若兄弟为黑色、近侄节点为红色、远侄为黑色,则对近侄执行旋转,交换兄弟与近侄颜色,转为远侄为红色的情形。
4、若兄弟为黑色、远侄节点为红色,则对兄弟执行旋转,将父节点颜色赋给兄弟,父节点与远侄染黑,并终止修复。
四、旋转操作中父子指针与颜色字段的同步更新
旋转是红黑树维持局部平衡的核心操作,左旋与右旋互为镜像。每次旋转不仅改变三个节点的左右连接关系,还需精确维护parent指针方向及颜色继承规则,避免引入新的违规。
1、以右旋为例:设节点x为其父节点p的左子,将x的right子树设为p的left子树,并更新该子树的parent为p。
2、将p的parent赋给x的parent字段;若p为根,则x成为新根并置parent为nullptr。
3、若p为其父节点g的left子,则令g->left = x;否则令g->right = x。
4、设置x->right = p;p->parent = x;完成拓扑重构后,再依修复场景决定是否修改x与p的颜色字段。
五、NIL哨兵节点在删除路径中的统一处理策略
为避免空指针判断干扰核心逻辑,红黑树实现中所有叶节点均指向同一静态NIL节点,该节点color固定为BLACK,left/right/parent均为nullptr。删除过程中所有对空子节点的引用均等价于对该NIL节点的访问,确保路径黑高计算与指针操作一致性。
1、在查找后继时,若某节点right为NIL,则该节点自身即为后继,无需进一步下降。
2、在双黑修复中,若兄弟节点为NIL,则其颜色视为BLACK,且两个子节点亦为NIL,自动落入情形二处理分支。
3、所有旋转操作前均校验子节点是否为NIL,若是则跳过对其子树parent字段的更新,仅调整非NIL侧指针。
4、NIL节点不可被删除、不可染色、不可作为旋转中心,其唯一作用是提供统一终端标识与黑高基准。


















