随处可见的红黑树(图文解释)

142 阅读3分钟

一、红黑树性质

(红黑树 - 定义, 插入, 构建_哔哩哔哩_bilibili)
1.根结点为黑色
2.每个节点不是红色就是黑色。但是叶子节点一定为黑色\color{red}{叶子节点一定为黑色}
3.如果一个节点为红的,那么它的两个儿子都是黑的。 4.对每个节点,从该节点到其子孙节点的所有路径上的包含相同数目的黑节点

image.png

二、调整

(一) 旋转操作(理解左旋右旋概念)

1、红黑树性质被破坏的时候,需要调整,调整方法就包括旋转。

1.1. 左旋

image.png

1.2. 右旋

image.png

(二)插入操作

1.1. 第一种情况:叔叔是红色节点

image.png

修改方法:
a、祖父节点g变为红色
b、叔叔节点u和父母节点p改为黑色
c、改为x=g。需要重新对上面节点进行编辑和判断是否满足红黑树性质。

image.png

1.2. 第二种情况:叔叔节点是黑色

1. LL型

image.png

修改方法:
a、右旋祖父节点g
b、父母节点p、祖父节点g颜色交换。

2. LR型

image.png

修改方法:
a、先左旋父母节点p b、重新标记x和p
c、再按1.2.1的过程重复

3. RR型

image.png

修改方法:
a、先左旋祖父节点g
b、交换g和p的颜色

4. RL型

image.png

修改方法:
a、右旋p
b、重新标记x和p
c、再按1.2.3.的过程重复

(红黑树 - 删除_哔哩哔哩_bilibili)

(三)删除操作[此处较复杂\color{red}{此处较复杂}]

1、执行标准的BST删除操作

在标准的删除操作中,我们最终都是删除一个叶子节点或只有一个孩子的情况。(对于内部节点,就是要删除节点左右孩子都存在的情况,最终都会退化到删除节点是叶子节点或者是只有一个孩子的情况。)  

2、简单情况:

2.1. 有左孩子或右孩子的情况(这里的孩子节点不是叶子节点)。且左孩子或右孩子为红色。需要将待删除节点和孩子节点相互代替并变黑。  
2.2. 要删除的节点为红色且无孩子节点(这里的孩子节点不是叶子节点),直接删除。  

3、复杂情况:

3.1. 删除节点无孩子节点。且为黑色。就会出现双黑节点。如果无双黑节点就会无法满足“对每个节点,从该节点到其子孙节点的所有路径上的包含相同数目的黑节点”的性质。

双黑节点: 假设要删除节点y,那它叶子节点x变为双黑节点。双黑节点就是将有2个黑色节点重合在一起,看起来像双黑。并且这2个节点都指向同一方向。

image.png

3.2. 在双黑节点情况下,就看兄弟是红色还是黑色了。
3.3.1. 如果兄弟是黑色,且兄弟至少有一个孩子是红色。就需要看它是LL、LR、RR、RL型中的哪一个了。

RL与LR类似,LR看懂就能明白RL。可以先看LL和RR。

image.png

image.png

image.png

image.png

image.png RL与LR类似,LR看懂就能明白RL。可以先看LL和RR。

3.3.2. 如果兄弟节点是黑色。且孩子都为黑色。就把兄弟变红,双黑上移。

image.png

3.4. 如果兄弟为红色,父兄变色,朝双黑旋转。兄弟变黑,父亲变红。对父亲旋转。

image.png

image.png