红黑树

红黑树:一个二叉查找树,红黑树也是平衡二叉树的一种,但在每个结点上增加一个存储位表示节点的颜色,可以是red或是black。

红黑树的性质:

1.每个结点或是红的,或是黑的。

2.根结点是黑的。

3.每个叶结点是黑的空结点(NULL)。

4.如果一个结点是红的,那它的两个儿子都是黑的。

5.对每个结点,从该结点到其子孙结点的所有路径上包含数目相同的黑结点。

最长路径不超过最短路径的2倍。

一个典型的红黑树:

向红黑树原树插入一个结点时,如果不影响原来红黑树的平衡,则对原红黑树不需要进行操作。如果影响到了原红黑树的平衡,则需要对红黑树进行操作,使得红黑树达到平衡。

向原来的红黑树插入数值为14的新结点时,由于父结点15是黑色结点,所以这种情况没有破坏结构,不需要做任何改变。

但是向原树插入21时,看下图:

由于父结点22是红色结点,因此这种情况打破了红黑结点的规则4,必须做出调整,该如何进行调整呢,调整方法有四种,变色,旋转,左旋转,右旋转。

1.变色:为了符合红黑树的规则,会把结点红变黑或者黑变红,下图展示的是红黑树的部分,需要注意结点25并非根结点,因为21和22链接出现红色,不符合规则4,所以把22红变黑。

但这样还是不符合规则5,所以需要把25黑变红:

因为25和27又是两个连续的红结点(规则4),所以需要静27红变黑。

2.左旋转:也就是逆时针旋转两个结点,使父结点被自己的右孩子所取代,而自己成为自己的左孩子(在移动时自己的孩子依然跟着自己的方向移动,并且方向不变)

右旋转:顺时针旋转两个结点,使得自己的父结点被左孩子取代,而自己成为自己的右孩子。

古关于左旋右旋及红黑树的操作可以参考博客:https://blog.csdn.net/Sun_TTTT/article/details/65445754

红黑树的使用:在STL中的set , map以及Linux的虚拟内存管理都是使用红黑树。红黑树用来存储有序的数据,时间复杂度时O(log n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章