红黑树规则详解(图文)

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树规则详解(图文)相关的知识,希望对你有一定的参考价值。

文章目录

红黑树

简介

红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。

1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的"红黑树"。
它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,
每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的。

红黑树的特点:

  • 首先它是一个平衡二叉B树
  • 每一个节点可以是红或者黑
  • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的

那么他的红黑规则是怎样的呢?下面我们通过举例一步步进入红黑树的世界:

红黑规则

红黑树的红黑规则如下:

  1. 每一个节点或是红色的,或者是黑色的
  2. 根节点必须是黑色
  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

例如下图就是一个典型的红黑树:

添加规则

首先红黑树添加节点的默认颜色!因为添加节点时,默认为红色,效率高

但是直接添加后就可能会破坏上述红黑树自己的规则

那么红黑树添加节点后如何保持红黑规则呢?

保持红黑规则

  • 根节点位置
    • 直接变为黑色
  • 非根节点位置
    • 父节点为黑色
      • 不需要任何操作,默认红色即可
    • 父节点为红色
      • 叔叔节点为红色
        1. 将"父节点"设为黑色,将"叔叔节点"设为黑色
        2. 将"祖父节点"设为红色
        3. 如果"祖父节点"为根节点,则将根节点再次变成黑色
      • 叔叔节点为黑色
        1. 将"父节点"设为黑色
        2. 将"祖父节点"设为红色
        3. 以"祖父节点"为支点进行旋转

整理成结构图如下:

很复杂吧,看不懂没关系,下面我们来具体举例带入一下这些规则对应的四种情况:

红黑树添加节点图文案例

第一种情况:根节点位置


根据根节点必须是黑色,所以插入的红的要变成黑色

例如:首先没有节点,插入了一个红色节点20,

这个节点是根节点,所以就直接就变成

第二种情况:非根节点位置→父结点为黑色


如果插入的是非根节点位置,如果父结点的黑色,那么插入一个红色节点不需要任何操作,因为红节点不影响上述五个规则

例如:再来一个18红节点和23红节点,父结点是黑的,那么确实不需要任何操作

第三种情况:非根节点位置→父结点为红色→叔叔节点为红色


如果插入的是非根节点位置,如果父结点的红色的话,就得分两种情况,这里得看一下他的叔叔节点,如果它的叔叔是红色,需要按照上面三步进行操作:

例如:再插入一个22红节点,他应该在23节点的左侧,这样就有问题了,规则里说两个红色节点不能相邻

那么我们就需要按照上面的三步就行操作:

  1. 将“父节点”设为黑色,将“叔叔节点”设为黑色
  2. 将“祖父节点”设为“红色”
  3. 如果祖父节点为根节点,则将根节点再次变成黑色

修改上面的案例,先将22设置为黑色,叔叔节点18也设置为黑色

再将他的祖父节点也就是20根节点设置为红色,但是第三条说的是根节点如果是父结点就不用改了,那么不改,最后效果如上图所示。

第四种情况:非根节点位置→父结点为红色→叔叔节点为黑色


如果插入的是非根节点位置,如果父结点的红色的话,叔叔是黑色的话,需要按照上面三步进行操作:

例如现在红黑树是这样的:

再插入一个14红节点,应该是放在15的左边

但是这样又违背了两红不能相连的规则,此时他的叔叔节点是黑色的Nil节点,这是就需要这三步操作进行修改:

  1. 将“父节点”设为“黑色”
  2. 将“祖父节点”设为“红色”
  3. 以祖父节点为支点进行旋转

首先对父结点与祖父节点进行设置,但是现在16与18就不满足两红不能相连的情况了,此时要进行第三个规则: 以祖父节点为支点进行旋转,这里也就是以16红节点为支点进行右旋转


最后旋转后的结果是这样的

暑期编程PK赛 得CSDN机械键盘等精美礼品!

以上是关于红黑树规则详解(图文)的主要内容,如果未能解决你的问题,请参考以下文章

红黑树

红黑树与JAVA实现

Java集合源码分析之基础:红黑树(RB Tree)

红黑树的实现(图文详解)

动态图文详解-史上最易懂的红黑树讲解手写红黑树(Red Black Tree)

红黑树