红黑树的变换
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的源码,看看红黑树如何用代码实现。
以上是关于红黑树的变换的主要内容,如果未能解决你的问题,请参考以下文章