红黑树的插入解析

版权声明:未经博主同意,禁止转载,联系方式qq2928013321 https://blog.csdn.net/weixin_42130471/article/details/83046040

以下讲解参考算法导论:

首先回顾一下红黑树的性质:

1、红黑树的所有结点颜色是红色或者黑色。

2、根结点是黑色

3、叶结点都为黑色

4、红色节点的左右孩子结点为黑色(推论:红色节点的父结点一定为黑色)

5、从树中的任意一个结点出发,到叶结点所有路径上黑色结点的个数相同。如根结点到叶结点有多条路径,每条路径上的黑色结点数一样。同理,其他结点也一样。

接下来进行插入结点的操作。

(1)首先要知道,红黑树的插入是按照二叉排序树的插入方式进行插入的。

(2)插入后红黑树的5个性质可能发生改变,所以要进行调整。另外要明确一点,红黑树插入新结点必须为红色,因为插入红色节点相比插入黑色结点对红黑树的性质更小。接下来,我们分析哪些性质发生了变化,才能知道如何进行调整。

分析:

1性质不可能发生变化。

2性质可能发生变化。当原来为空树时,插入一个新节点,这个新节点就是根结点且为红色。对于这种情况比较简单,只需要把颜色改成黑色就可以了。

3性质不会发生变化。

4性质可能会发生变化。当插入结点的父结点为红色时。这种情况也是我们接下来唯一要讨论的。

5性质不会发生变化。因为插入的是红色结点对黑高没有影响。

对于4性质改变我们还需要细分情况。参考下图和文字说明

说明:图中浅颜色的结点代表红色,深颜色的结点代表黑色。

情况1:如图中情况1,新插入结点4为红色,父结点5也是红色,叔叔结点8也为红色,则5、8节点变为黑7变为红。若祖父2位黑则结束。若祖父2为红(图中情况2)则又产生了性质4的违背,需要继续调整。若7的兄弟结点(图中看不清编号)为红色,接下来的调整就是把2看成新插入的结点重复情况1;若7的兄弟结点是黑色,这时就是我们遇到的情况2.

情况2:如图情况2,新插入结点7,父结点2都是红色,7的叔叔结点(图中2的左孩子)为黑色,这时我们要对2节点进行左旋操作,这样我们就可以变成情况3了。

情况3:为什么要变成情况3呢?因为情况2中新插入结点是父结点的右孩子,变成情况3以后,就变成了一个红色节点是另一个红色节点的左孩子了(当然父子关系也发生了变化,但是不影响,我们可以把原来的父结点2看成新插入结点)。总结一下情况3:新插入结点是父结点的左孩子,新插入结点和父结点都是红色,叔叔结点是黑色。这时我们要对祖父结点(父结点的父结点,在图中正好是根节点)进行右旋操作,右旋以前(以后也一样)父结点2和祖父节点(图中根节点)颜色变为自身相反色。第四个图是变后的结果。

差不多就这样了,最后把伪代码贴上:

猜你喜欢

转载自blog.csdn.net/weixin_42130471/article/details/83046040
今日推荐