(1)每个节点只有两种颜色:红色和黑色 。
(2)根节点是黑色的 。
(3)每个叶子节点(NIL)都是黑色的空节点 。
(4)从根节点到叶子节点,不会出现两个连续的红色节点 。
(5)从任何一个节点出发,到叶子节点,这条路径上都有相同数目的黑色节点 。
这五条就是红黑树的特征,你每看一个特征最好重新看一遍图,这样可以加深理解 。这五条特征看起来真的很复杂,不过正是由于这些复杂的特征才保证了红黑树的良好特性 。如何保证的呢?我们从增删改查四个角度来一个一个分析一下:
1、查询节点
查询节点是最简单的一个,他的查找过程和二叉查找树一样,查找元素比当前节点大,就从右子树继续查找比较,查找元素比当前节点小,就从左子树继续查找比较 。查找过程就不再赘述了 。
2、插入节点
插入节点是最麻烦的一个,它分为三种情况 。我们一种一种看,这样比较有条理性 。
第一种情况:新节点没有父节点
没有父节点只有一种情况,就是插入的节点是整棵树第一个节点,也就是根节点,为此我们只需要把插入节点涂成黑色就OK了 。这也就保证了性质2:根节点是黑色的 。
第二种情况:新节点的父节点是黑色
为此我们举一个例子,比如说上面的红黑树中,我们插入节点14 。来看一下会发生什么情况?

文章插图
这种情况我们发现新插入节点14的父节点就是黑色的 。现在为了保证红黑树的性质,我们对照每个特性来检查一遍 。只要有一条不满足,我们都需要调整 。我们重新对照之后会发现每一条都符合 。此时不需要调整 。
第三种情况:新节点的父亲节点为红色
我们还是举个例子,比如我们在最开始的红黑树基础之上插入节点21,此时会发生什么情况呢?

文章插图
此时还是老规矩,对照着红黑树的5个特征一个一个来看,只要是违反了一条就需要做出调整 。我们来看一下:
(1)每个节点只有两种颜色:红色和黑色 。这一条满足 。
(2)根节点是黑色的 。这一条也满足 。
(3)每个叶子节点(NIL)都是黑色的空节点 。这一条满足 。
(4)从根节点到叶子节点,不会出现两个连续的红色节点 。这一条发现不满足 。
就是上面这一条规则没有满足,所以我们此时需要调整?问题来了如何调整呢?因为直接看父节点没办法实现,所以还需要观察另外的节点,也就是新节点的叔叔节点 。根据叔叔节点的颜色来调整 。调整的方式有两种:变色和旋转 。
(1)叔叔节点是红色:
此时插入的节点是21,但是叔叔节点是27,更好是红色 。我们直接来看调整的步骤:
第一步:把新节点21的父节点22变成黑色 。

文章插图
此时重新看一下是否满足红黑树的五条特征了没,一条一条发现,第五条没有满足,也就是从任何一个节点出发,到叶子节点,这条路径上没有相同数目的黑色节点 。比如从25出发 。这时候怎么办呢?那就继续调整 。
第二步:把22的父节点25变成红色

文章插图
这时候还是老规矩,不要嫌弃麻烦,因为只有经历了一步又一步的麻烦之后,你才能牢记那5条规则特征 。我们对照之后会发现节点25和节点27是两个连续的红色节点,这时候又破坏了规则4 。怎么办呢?那就继续调整就OK了 。
难道这时候还要继续往上调整吗?如果你这样做就错了,因为不断地往上调整最后就会把根节点变成了红色,会走进死胡同 。我们往下走 。
第三步:把节点27变成黑色

文章插图
来吧,继续重新审查那5条规则特征 。很明显节点17和节点25是两个连续的红色,又破坏了 。是不是心太累了,调整了这么久,还是没有保证那5条规则,感觉是不是还没有平衡二叉树好 。如果你现在有这种感觉,我只能说,希望你继续坚持下去,胜利就在眼前 。
第四步:把节点17和节点18都变成黑色节点

文章插图
来来来,现在你再对照一下那5条规则,是不是完全保证了 。写到这真的是太累了,和你读这篇文章的感觉一样一样的,不过这种情况也只是插入情况中的一种 。继续往下看:
推荐阅读
- 4大恶习导致皮肤干燥 冬季护肤你得这么做!
- 为什么这么多人喜欢喝正山小种红茶
- 开自动挡车有“四不准”,经常这么做的,肯定没少往修理厂跑
- 手指瘢痕挛缩
- 都匀毛尖、湄潭翠芽、遵义红茶……贵州这么多茶,你pick哪一个?
- Redis中的发布订阅模式用代码实现就是这么简单
- 喝春茶原来还有这么多讲究
- 吃了多年桃子才知道,原来去除桃毛这么简单,学会了受用一生
- 没想到苏州这个岛藏了这么多好吃好玩的,住一晚包吃住人均才200
- 情绪的负面影响 负面情绪竟然可以引发这么多疾病
