红黑树规则详解(图文)
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树规则详解(图文)相关的知识,希望对你有一定的参考价值。
文章目录
红黑树
简介
红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的"红黑树"。
它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,
每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的。
红黑树的特点:
- 首先它是一个平衡二叉B树
- 每一个节点可以是红或者黑
- 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的
那么他的红黑规则是怎样的呢?下面我们通过举例一步步进入红黑树的世界:
红黑规则
红黑树的红黑规则如下:
- 每一个节点或是红色的,或者是黑色的
- 根节点必须是黑色
- 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
- 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
- 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
例如下图就是一个典型的红黑树:
添加规则
首先红黑树添加节点的默认颜色!因为添加节点时,默认为红色,效率高
但是直接添加后就可能会破坏上述红黑树自己的规则
那么红黑树添加节点后如何保持红黑规则呢?
保持红黑规则
- 根节点位置
- 直接变为黑色
- 非根节点位置
- 父节点为黑色
- 不需要任何操作,默认红色即可
- 父节点为红色
- 叔叔节点为红色
- 将"父节点"设为黑色,将"叔叔节点"设为黑色
- 将"祖父节点"设为红色
- 如果"祖父节点"为根节点,则将根节点再次变成黑色
- 叔叔节点为黑色
- 将"父节点"设为黑色
- 将"祖父节点"设为红色
- 以"祖父节点"为支点进行旋转
- 叔叔节点为红色
- 父节点为黑色
整理成结构图如下:
很复杂吧,看不懂没关系,下面我们来具体举例带入一下这些规则对应的四种情况:
红黑树添加节点图文案例
第一种情况:根节点位置
根据根节点必须是黑色,所以插入的红的要变成黑色
例如:首先没有节点,插入了一个红色节点20,
这个节点是根节点,所以就直接就变成
第二种情况:非根节点位置→父结点为黑色
如果插入的是非根节点位置,如果父结点的黑色,那么插入一个红色节点不需要任何操作,因为红节点不影响上述五个规则
例如:再来一个18红节点和23红节点,父结点是黑的,那么确实不需要任何操作
第三种情况:非根节点位置→父结点为红色→叔叔节点为红色
如果插入的是非根节点位置,如果父结点的红色的话,就得分两种情况,这里得看一下他的叔叔节点,如果它的叔叔是红色,需要按照上面三步进行操作:
例如:再插入一个22红节点,他应该在23节点的左侧,这样就有问题了,规则里说两个红色节点不能相邻
那么我们就需要按照上面的三步就行操作:
- 将“父节点”设为黑色,将“叔叔节点”设为黑色
- 将“祖父节点”设为“红色”
- 如果祖父节点为根节点,则将根节点再次变成黑色
修改上面的案例,先将22设置为黑色,叔叔节点18也设置为黑色
再将他的祖父节点也就是20根节点设置为红色,但是第三条说的是根节点如果是父结点就不用改了,那么不改,最后效果如上图所示。
第四种情况:非根节点位置→父结点为红色→叔叔节点为黑色
如果插入的是非根节点位置,如果父结点的红色的话,叔叔是黑色的话,需要按照上面三步进行操作:
例如现在红黑树是这样的:
再插入一个14红节点,应该是放在15的左边
但是这样又违背了两红不能相连的规则,此时他的叔叔节点是黑色的Nil节点,这是就需要这三步操作进行修改:
- 将“父节点”设为“黑色”
- 将“祖父节点”设为“红色”
- 以祖父节点为支点进行旋转
首先对父结点与祖父节点进行设置,但是现在16与18就不满足两红不能相连的情况了,此时要进行第三个规则: 以祖父节点为支点进行旋转,这里也就是以16红节点为支点进行右旋转
最后旋转后的结果是这样的
以上是关于红黑树规则详解(图文)的主要内容,如果未能解决你的问题,请参考以下文章