红黑树的变换

Posted 悟空大圣的花果山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树的变换相关的知识,希望对你有一定的参考价值。

 红黑树:左旋、右旋及红黑变换


通过上一篇,我们知道,

二叉树的结构决定了它搜索的性能,

那么我们应该怎么优化呢?

因此就有了AVL树红黑树

AVL树:平衡二叉树,它的左右子树高度之差不超过1.

这样确实可以避免一条直线型结构,但还不是我们最理想的。

为什么呢?因为插入和删除的开销太大。

通过性能综合考虑选用:红黑树



01


红黑树的性质


1、每个结点不是红色就是黑色

2、不可能有连在一起的红色结点

3、根结点都是黑色

4、每个红色结点的两个子节点都是黑色

5、任一结点到其子树中每个叶子结点的路径都有相同数量的黑色结点


红黑树在插入和删除的时候如何保证以上性质:

1、改变颜色

2、旋转(左旋、右旋)


先不考虑颜色,通过两幅图带大家理解左旋和右旋的概念:

左旋:以5为结点按逆时针方向进行旋转,此时8到了结点位置,5作为了8的左子树。0依然作为5的左子树,10依然作为8的右子树。因为左子树一定比结点小,右子树一定比结点大,所以此时6的指针位置需要改变,变成了5的右子树。



右旋:以5为结点按顺时针方向进行旋转,此时2到了结点位置,5作为了2的右子树。8依然作为5的右子树,1依然作为2的左子树。同理,此时3的指针位置需要改变,变成了5的左子树。



02


红黑树的变换原理


搞懂了左旋、右旋的概念,我们来看看红黑树的原理:


图一:假设在原来的红黑树下,新增一个红色的6此时,6和7违反了性质二,所以需要变换颜色。

图二:将7和10变为黑色,将8变为红色。此时满足了性质五,依然不满足性质二。

图三:这个时候,就要将5作为结点进行左旋。但依然不满足性质二。

图四:将8变为黑色,15变为红色,并以15为结点进行右旋。这个时候,就满足了所有的红黑树性质。



那么大家就会有疑问了:

什么时候变颜色,什么时候左旋,什么时候右旋呢?

接下来,我就跟大家说说红黑树的颜色变换与旋转规则。


03


红黑树的颜色变换与旋转规则


1、变颜色:当前结点的父结点是红色,叔叔结点也是红色。

  (1)、把父结点变为黑色

  (2)、把叔叔结点变为黑色

  (3)、把祖父结点变为红色

  (4)、把指针定义到祖父结点,设为当前要操作的结点

2、左旋:当前结点是右子树,且当前父结点是红色,叔叔结点是黑色,以当前父结点左旋

3、右旋:当前结点是左子树,且当前父结点是红色,叔叔结点是黑色

  (1)、把父结点变为黑色

  (2)、把祖父结点变为红色

  (3)、以祖父结点右旋




看过了规则,希望大家再对照着上面的4幅图,自己想一想红黑树的变换过程。然后再看看HashMap、TreeMap的源码,看看红黑树如何用代码实现。

以上是关于红黑树的变换的主要内容,如果未能解决你的问题,请参考以下文章

红黑树平衡二叉查找树

基于红黑树的骨架提取Java

数据结构(十 一) ---[实现红黑树(Red Black Tree)]

C++红黑树

红黑树介绍与实现

红黑树介绍与实现