红黑树添加,新增数据操作原理分析

红黑树添加,新增数据操作原理分析(不包含任何代码)

在讲红黑树插入操作之前,我必须多嘴说一些必要的东西,因为红黑树的添加操作,是基于以下两点完成的,假如你现在没有比学习更重要的是要做,不妨耐下心看看

1:红黑树有哪些特性?

特性1:红黑树的节点只有红色,或者黑色

特性2:红黑树的根节点是黑色

特性3:每个红色节点的子节点必须是黑色

特性4:从任意节点,到他的所有的子节点的路径上,经过的黑色节点数总是相同

提一下,红黑树的叶子节点默认为黑色(这里的叶子节点,不是普通二叉树的叶子节点,而是不存在的,为空的节点,如下面情况二的配图,为null的就是叶子节点,实际上是不存在的)

假如你知道下面 这些问题的答案,那么你一定看懂了这4个特性:

1:请问,如果 红色节点P 有子节点,请问以下哪种情况是不可能出现的?
A:P只有一个黑色右子节点
B:P只有一个黑色左子节点
C:P有两黑色子节点
D:P有红色子节点

2:请问,可以出现两个连续的 红色 节点的情况吗?

3:请问,可以出现两个连续的 黑色 节点的情况吗?

正确答案在文章的最下方,假如你没有找到,那一定是我忘了写。

2:什么是左旋,右旋?

左旋,右旋的作用:是为了保证红黑树的平衡,而做的一些操作。

左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋 ---- 左旋:

下面这个操纵,一般我们说,对节点E做左旋操作

所以从下面这个图我们可以看出(当时我真没看出了):

  1. 左旋操作的节点,一定要有 右子节点

左旋
右旋 --------- 右旋 --------- 右旋 --------- 右旋 --------- 右旋 --------- 右旋:

下面这个操作,一般我们说,对节点S 做右旋操作

同理

  1. 右旋操作的节点,一定要有 左子节点

右旋
千万不要怀疑我用动图来描述是因为懒,确实是没那个实力,描述这么复杂的东西。

接下来我会用一下行话,不懂得可以参考下图

在这里插入图片描述

红黑树插入操作

  1. 插入什么颜色的节点?

    答:插入红色节点,因为不论我们插入的节点是什么颜色,都有破坏红黑树四大特性(就是我开篇就说的那四条特性)的可能,不满足四大特性的树,都不是红黑树,所以后面我们就要用 左旋,右旋,变色(就是将某些节点变成黑色,将某些节点变成红色,没错就是这么任性)做调整,以保证满足红黑树的 四大特性 。大佬们认为:插入黑色节点调整起来比较复杂,而插入红色节点,调整起来比较容易(容易个锤子!!),所以我们插入默认都是红色节点。

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

资料二:https://segmentfault.com/a/1190000012728513

资料三:https://www.cnblogs.com/qingergege/p/7351659.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值