红黑树删除后需通过变色与旋转恢复平衡,共分四场景:场景一兄弟为红时旋转变色转为兄弟为黑;场景二兄弟及两侄子均黑时染红兄弟并上溯;场景三近侄子红时反向旋转调整为场景四;场景四远侄子红时旋转变色终结修正。

一、红黑树节点删除后需满足的平衡条件
当从红黑树中删除一个节点后,可能破坏红黑树的五条性质,尤其是黑高一致性和红节点不连续性。若被删节点为黑色,其子树黑高降低,需通过变色与旋转恢复局部平衡。以下分析四种典型修正场景,每种对应特定的兄弟节点与侄子节点颜色组合。
二、场景一:兄弟节点为红色
该情况表明父节点必为黑色,且兄弟的两个子节点均为黑色(否则兄弟不可能为红)。此时通过一次旋转将兄弟转为黑色,父节点转为红色,并使原兄弟成为新父节点,从而进入后续更易处理的兄弟为黑的情形。
1、以父节点为支点,对当前节点执行左旋(若当前节点为左孩子)或右旋(若为右孩子)。
2、将旋转后的原兄弟节点颜色设为黑色。
立即学习“C++免费学习笔记(深入)”;
3、将旋转后的原父节点颜色设为红色。
4、更新当前节点指向原兄弟位置,进入下一修正阶段。
三、场景二:兄弟节点为黑色,且两个侄子节点均为黑色
此时无法通过旋转转移黑高,只能将兄弟染红,使父节点所在子树整体黑高减一,再以父节点为新的当前节点向上递归修正。
1、将兄弟节点颜色设为红色。
2、将当前节点更新为其父节点。
3、若当前节点为根节点且为红色,则将其染黑;若当前节点为根节点且为黑色,则修正结束。
四、场景三:兄弟节点为黑色,远侄子为黑色、近侄子为红色
近侄子指与当前节点同侧的侄子(如当前为左孩子,则近侄子为兄弟的左孩子)。此时先对兄弟执行一次反向旋转,使其变为场景四形态,再统一处理。
1、若当前节点为左孩子,对兄弟节点执行右旋;若为右孩子,对兄弟节点执行左旋。
2、交换兄弟节点与其新父节点(即原近侄子)的颜色。
3、更新兄弟节点指针,使其指向旋转后的新兄弟(即原近侄子)。
4、此时进入场景四状态,继续执行后续步骤。
五、场景四:兄弟节点为黑色,远侄子为红色
此为最终可终结修正的场景。通过一次旋转将远侄子的黑色上移至父节点,并调整相关节点颜色,使当前子树黑高恢复且红黑性质全部满足。
1、以父节点为支点,对当前节点执行左旋(若当前为左孩子)或右旋(若为右孩子)。
2、将旋转后的原兄弟节点颜色设为父节点的颜色。
3、将旋转后的原父节点颜色设为黑色。
4、将旋转后的远侄子(即新子树的原远侄子)颜色设为黑色。
5、将当前节点置为空指针,终止修正流程。


















