一、红黑树性质
(红黑树 - 定义, 插入, 构建_哔哩哔哩_bilibili)
1.根结点为黑色
2.每个节点不是红色就是黑色。但是。
3.如果一个节点为红的,那么它的两个儿子都是黑的。
4.对每个节点,从该节点到其子孙节点的所有路径上的包含相同数目的黑节点
二、调整
(一) 旋转操作(理解左旋右旋概念)
1、红黑树性质被破坏的时候,需要调整,调整方法就包括旋转。
1.1. 左旋
1.2. 右旋
(二)插入操作
1.1. 第一种情况:叔叔是红色节点
修改方法:
a、祖父节点g变为红色
b、叔叔节点u和父母节点p改为黑色
c、改为x=g。需要重新对上面节点进行编辑和判断是否满足红黑树性质。
1.2. 第二种情况:叔叔节点是黑色
1. LL型
修改方法:
a、右旋祖父节点g
b、父母节点p、祖父节点g颜色交换。
2. LR型
修改方法:
a、先左旋父母节点p b、重新标记x和p
c、再按1.2.1的过程重复
3. RR型
修改方法:
a、先左旋祖父节点g
b、交换g和p的颜色
4. RL型
修改方法:
a、右旋p
b、重新标记x和p
c、再按1.2.3.的过程重复
(三)删除操作[]
1、执行标准的BST删除操作
在标准的删除操作中,我们最终都是删除一个叶子节点或只有一个孩子的情况。(对于内部节点,就是要删除节点左右孩子都存在的情况,最终都会退化到删除节点是叶子节点或者是只有一个孩子的情况。)
2、简单情况:
2.1. 有左孩子或右孩子的情况(这里的孩子节点不是叶子节点)。且左孩子或右孩子为红色。需要将待删除节点和孩子节点相互代替并变黑。
2.2. 要删除的节点为红色且无孩子节点(这里的孩子节点不是叶子节点),直接删除。
3、复杂情况:
3.1. 删除节点无孩子节点。且为黑色。就会出现双黑节点。如果无双黑节点就会无法满足“对每个节点,从该节点到其子孙节点的所有路径上的包含相同数目的黑节点”的性质。
双黑节点: 假设要删除节点y,那它叶子节点x变为双黑节点。双黑节点就是将有2个黑色节点重合在一起,看起来像双黑。并且这2个节点都指向同一方向。
3.2. 在双黑节点情况下,就看兄弟是红色还是黑色了。
3.3.1. 如果兄弟是黑色,且兄弟至少有一个孩子是红色。就需要看它是LL、LR、RR、RL型中的哪一个了。
RL与LR类似,LR看懂就能明白RL。可以先看LL和RR。
RL与LR类似,LR看懂就能明白RL。可以先看LL和RR。
3.3.2. 如果兄弟节点是黑色。且孩子都为黑色。就把兄弟变红,双黑上移。
3.4. 如果兄弟为红色,父兄变色,朝双黑旋转。兄弟变黑,父亲变红。对父亲旋转。