红黑树添加,新增数据操作原理分析(不包含任何代码)
在讲红黑树插入操作之前,我必须多嘴说一些必要的东西,因为红黑树的添加操作,是基于以下两点完成的,假如你现在没有比学习更重要的是要做,不妨耐下心看看
1:红黑树有哪些特性?
特性1:红黑树的节点只有红色,或者黑色
特性2:红黑树的根节点是黑色
特性3:每个红色节点的子节点必须是黑色
特性4:从任意节点,到他的所有的子节点的路径上,经过的黑色节点数总是相同
提一下,红黑树的叶子节点默认为黑色(这里的叶子节点,不是普通二叉树的叶子节点,而是不存在的,为空的节点,如下面情况二的配图,为null的就是叶子节点,实际上是不存在的)
假如你知道下面 这些问题的答案,那么你一定看懂了这4个特性:
1:请问,如果 红色节点P 有子节点,请问以下哪种情况是不可能出现的?
A:P只有一个黑色右子节点
B:P只有一个黑色左子节点
C:P有两黑色子节点
D:P有红色子节点
2:请问,可以出现两个连续的 红色 节点的情况吗?
3:请问,可以出现两个连续的 黑色 节点的情况吗?
正确答案在文章的最下方,假如你没有找到,那一定是我忘了写。
2:什么是左旋,右旋?
左旋,右旋的作用:是为了保证红黑树的平衡,而做的一些操作。
左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋:
下面这个操纵,一般我们说,对节点E做左旋操作
所以从下面这个图我们可以看出(当时我真没看出了):
- 做左旋操作的节点,一定要有 右子节点
右旋 --------- 右旋 --------- 右旋 --------- 右旋 --------- 右旋 --------- 右旋:
下面这个操作,一般我们说,对节点S 做右旋操作
同理
- 做右旋操作的节点,一定要有 左子节点
千万不要怀疑我用动图来描述是因为懒,确实是没那个实力,描述这么复杂的东西。
接下来我会用一下行话,不懂得可以参考下图
红黑树插入操作
-
插入什么颜色的节点?
答:插入红色节点,因为不论我们插入的节点是什么颜色,都有破坏红黑树四大特性(就是我开篇就说的那四条特性)的可能,不满足四大特性的树,都不是红黑树,所以后面我们就要用 左旋,右旋,变色(就是将某些节点变成黑色,将某些节点变成红色,没错就是这么任性)做调整,以保证满足红黑树的 四大特性 。大佬们认为:插入黑色节点调整起来比较复杂,而插入红色节点,调整起来比较容易(容易个锤子!!),所以我们插入默认都是红色节点。
2.插入的情况:
- 情况一:插入一个节点时,根节点为空时(应读者要求,让我给这种情况配上一张图)
对于这种情况,将插入的红色节点,作为根节点,然后将他变为黑色就好了。
-
情况二:插入时,父节点为黑色节点。
这种情况直接插入就完了,不需要做任何改变,插入后的结果:
-
情况三:插入节点的父节点是红色
-
这种情况下,插入节点的父节点如果是红色,那么插入节点一定也有祖父节点(如果不知道为什么,建议你再仔细思考一下我之前提的三个问题),下面讨论的情况是,假设父节点是祖父节点的左子节点
这里又要分三种情况:
①、插入节点的父节点和叔叔节点(父节点的亲兄弟节点)均为红色。②、插入节点的父节点是红色的,叔叔节点是黑色的,且插入节点是其父节点的右子节点。
③、插入节点的父节点是红色的,叔叔节点是黑色的,且插入节点是其父节点的左子节点。
-
1、假设要插入的节点为N,插入节点的父节点和叔叔节点(父节点的亲兄弟节点)均为红色。
这种情况,可以直接将插入节点的父节点P和叔叔节点U变为黑色,祖父节点G变为红色
假如现在将节点7设为N作为当前节点
现在就变成我们要讨论的情况②了:
②插入节点的父节点是红色的,叔叔节点是黑色的,且插入节点是其父节点的右子节点。
现在我们只需要对N节点的父节点做 左旋操作 就行了
假如现在将节点2设为N作为当前节点
现在就变成我们要讨论的情况 ③了:
③、插入节点的父节点是红色的,叔叔节点是黑色的,且插入节点是其父节点的左子节点。
这种情况可以将N的父节点变为黑色,祖父节点变为红色,对祖父节点进行右旋操作
这个样子就很完美了。
上面的 ① ② ③ 讨论的都是插入节点的父节点是祖父节点的左子节点的情况
如果 插入节点的父节点是祖父节点的右子节点的情况呢?
情况① ,还是按照原来的情况一解决
情况③ ,就按照上面的情况 ②解决,不同的是 上面的情况 ②是 左旋,而 此处你要做的事右旋
情况②,就按照上面的情况③解决,不同是 上面的情况③,变色后做的是右旋,而此处你要做的是左旋
这个插入过程,到这就结束了。
假如你对上面的原理好像懂,又想加强一下印象,不妨自己尝试构建一个红黑树。
插入结点:12、1、9、2、0、11、7、19、4、15、18、5、14、13、10、16、6、3、8、17
如果中间有什么不懂,可以参考这篇文章,每一个节点的插入过程都在里面
https://www.jianshu.com/p/ad5d65e7ce62
最后的结果图
特性1:红黑树的节点只有红色,或者黑色
特性2:红黑树的根节点是黑色
特性3:每个红色节点的子节点必须是黑色
特性4:从任意节点,到他的所有的子节点的路径上,经过的黑色节点数总是相同
上面问题的答案:
1:请问,如果 红色节点P 有子节点,请问以下哪种情况是不可能出现的?
A:P只有一个黑色右子节点
B:P只有一个黑色左子节点
C:P有两黑色子节点
D:P有红色子节点
答案:ABD, AB违反了特性4,D违反了特性3(可以尝试自己画个图试试~~)
2:请问,可以出现两个连续的 红色 节点的情况吗?
答案:不行,因为特性3:每个红色节点的子节点必须是黑色
3:请问,可以出现两个连续的 黑色 节点的情况吗?
答案:可以,这并没有违反任何特性
最后感谢下面这篇几篇文章,我是通过这几篇文章了解红黑树的
资料一:https://www.cnblogs.com/ysocean/p/8004211.html