编辑
2025-04-09
记录知识
0
请注意,本文编写于 79 天前,最后修改于 59 天前,其中某些信息可能已经过时。

目录

基础红黑树
父节点是黑色
父节点和叔叔节点都是红色
父红叔黑LL状态
父红叔黑RR状态
父红叔黑LR状态
父红叔黑RL状态
总结

根据文章《rb-tree实现-插入操作-原理》中的内容,我们归类了红黑树的所有操作,光有理论不行,本文演示插入的所有场景

基础红黑树

现在我们构建了一个10个元素的红黑树,其值从0-20,默认是偶数,其形状如下

image.png

父节点是黑色

我们测试插入节点1,则遍历到节点2上,往左边插入即可,如下

image.png

父节点和叔叔节点都是红色

为了让父节点和叔叔节点都是红色,需要先插入节点3,则情况如下

image.png

然后插入节点0,则此时会将叔叔和父亲染色为黑色,祖父设置为红色,然后向上递归,如下

image.png

父红叔黑LL状态

为了满足上述状态,需要先删掉节点0和3,其现状如下

image.png

此时我们添加节点0,它满足LL状态(祖父的左孩子是父,父的左孩子是节点0)

  • 第一步:将节点2(祖父节点)进行右旋,右旋后如下

image.png

  • 第二步:将节点0的兄弟节点2和父节点1的颜色互换,如下

image.png

父红叔黑RR状态

根据现在的情况,如果插入节点21,则满足父红叔黑RR状态(祖父的右孩子是父,父的右孩子是节点0)

  • 第一步:将节点18(祖父节点)进行左旋,左旋后如下

image.png

  • 第二步:将节点21的兄弟节点18和父节点20的颜色互换,如下

image.png

父红叔黑LR状态

为了满足父红叔黑LR状态,需要先删除节点21,则初始情况如下

image.png

此时如果我们插入节点19,则满足父红叔黑LR状态

  • 第一步:对节点18(父节点)进行左旋,关注节点变成节点18(父节点)。左旋后如下

image.png

  • 第二步:对节点20(节点18(此时的关注节点)的祖父节点)右旋。右旋后如下

image.png

  • 第三步:将节点18(此时的关注节点)的兄弟节点20和父节点19的颜色互换,如下

image.png

父红叔黑RL状态

为了满足父红叔黑RL状态,需要先删除节点0,2,再插入节点3,则初始情况如下

image.png

此时我们插入节点2,则满足父红叔黑RL状态

  • 第一步:对节点3(父节点)进行右旋,关注节点变成节点3(父节点)。右旋后如下

image.png

  • 第二步:对节点1(节点3(此时的关注节点)的祖父节点)左旋。左旋后如下

image.png

  • 第三步:将节点3(此时的关注节点)的兄弟节点1和父节点2的颜色互换,如下

image.png

总结

至此,对于红黑树的插入操作的所有情况已经图示介绍了。