本文根据<rb-tree实现-删除操作-原理>文章的原理描述,逐一演示删除操作
红色根节点不影响平衡,无需调整,故直接删除,如下图
假设当前红黑树如下,我们准备删除节点1
此时节点1有两个空黑节点,则直接进行第二阶段修复
在修复时,其情况为,兄弟节点6是黑色,且节点6包含两个空黑节点,如下图所示
于是步骤为如下:
如下图示
此时对于节点4,其兄弟节点13是黑色,兄弟节点包含两个黑节点9和16,则步骤如下:
如下图示
假设当前红黑树如下,我们准备删除节点4
那么步骤如下
比较简单,就不截图了。
要让删除节点的左孩子是删除节点的前驱节点,那么待删除节点的左孩子没有右孩子。 假设当前红黑树如下,我们准备删除节点8,因为节点8的左孩子节点4没有右孩子,所以节点4就是前驱节点
那么步骤如下:
如下图
如果前驱节点不是删除节点的左孩子,那么前驱节点和被删除节点没有强相关性,我们在替换删除节点后,需要进行第二步根据实际情况修复步骤
假设当前红黑树如下
此时我们删除节点30,按照前驱方式,默认节点28作为替代节点,如下
此时替代节点是节点26的右孩子,其兄弟节点22是黑色,且其兄弟节点22有两个黑色节点,我们需要:
如下图
此时关注节点是26,其兄弟节点35是黑色,左侄子节点33是黑色,右侄子节点42是红色。我们需要:
如下图
为了复现此场景的例子,我们需要构造红黑树如下
此时我们删除节点28,此时节点27作为前驱节点替换到节点28位置上,而节点27作为关注节点,其兄弟节点21是红色。状态如下
此时步骤如下
此时状态如下
此时关注节点的兄弟节点24是黑色,其左右孩子都是红色,符合场景:修复阶段:关注节点的兄弟节点是黑色,其左右侄子都是红色
此时关注节点作为节点26的右孩子,所以步骤如下
此时调整完成后的状态如下
为了准备这种情况,我们需要构造红黑树情况如下,我们关注节点35,如下
此时我们删除节点35,那么节点33会替代节点35,然后关注节点在原节点33的位置,记住节点33是父节点32的右孩子,那么状态如下
此时关注节点的兄弟节点30是黑色,右侄子是红色,左侄子是黑色 我们需要目的将红色节点搬到左侄子节点上,那么步骤如下
那么此时状态如下
此时关注节点不变,其兄弟节点31是黑色,其左侄子节点是红色,右侄子节点是黑色,那么步骤如下
上述步骤完成之后,状态如下
至此,针对删除的所有场景演示完成了,本文没有按照关注节点的左右孩子都重复介绍,只是按照单边作为示例,演示了所有的场景。那么本文涉及到的场景如下:
可以对应文章<rb-tree实现-删除操作-原理>查看场景
删除阶段:
修复阶段:
至此,可以发现,全部演示完成。