首先手撸红黑树,需要明白红黑树是什么东西?

其实红黑树其底层就是(特殊的,会自平衡)二叉查找树.就是这么简单

很多人懵逼就是不知道其底层结构.
可能有同学会问,什么是二叉查找树?什么是平衡树?对于这两个有疑问的同学,可以看下我往期的博客

30分钟看完数据结构和算法原理

首先要明白 红黑树五条性质: 
性质一:节点是红色或者是黑色; 
在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。 
性质二:根节点是黑色; 
根节点总是黑色的。它不能为红。 
性质三:每个叶节点(NIL或空节点)是黑色;

30分钟手撸红黑树

这个图片就是一个红黑树,NIL节点是个空节点,并且是黑色的。 
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点,黑色的可以连在一起); 
就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。

性质五:从任一节点到其没个叶节点的所有路径都包含相同数目的黑色节点

下面的图从根节点到每一个NIL节点的路径中,都包含了相同数量的黑色节点。

30分钟手撸红黑树

 

这五条性质约束了红黑树,可以通过数学证明来证明,满足这五条性质的二叉树可以将查找删除维持在对数时间内。 
当我们进行插入或者删除操作时所作的一切操作都是为了调整树使之符合这五条性质。 
下面我们先介绍两个基本操作,旋转。 
旋转的目的是将节点多的一支出让节点给另一个节点少的一支,旋转操作在插入和删除操作中经常会用到,所以要熟记。


什么是左旋?左旋就是将当前要旋转的点进行逆时钟转90度,然后把要旋转的点(未旋转之前)的右节点的左子树节点挂到要旋转的点(已经旋转完毕)的右子树节点

好懵逼啊!!!不着急用一个动画了解

左旋图:

30分钟手撸红黑树

右旋恰好相反

右旋图:

30分钟手撸红黑树

 

 

接下来讲插入:

首先一个节点要插进来,颜色默认红色,根据节点的大小,想按照二叉查找树的规则插到相应的位置.

然后就要进行颜色变换了

变换规则如下(下面的图片文字真是天书啊!??):

30分钟手撸红黑树

 

又是好懵逼啊?!!!!

别着急用一个例子分析

首先我有了一个红黑树,现在有一个节点6想往里面插(我承认我没有开车),先根据二叉查找树的规则插到相应的位置,如下图

30分钟手撸红黑树

然后插完你会发现6 和7 颜色一样,连在一起了,破坏了红黑树的规则了(有毒.......)

出现这种问题,只能进行接下来的颜色变换了

首先当前节点6 的父亲7变为黑色

再把当前节点6 的叔叔13变为黑色

再把当前节点6 的爷爷12变为黑色

然后再把指针移到12这个节点(也就是当前节点变成12了)

如下图:

30分钟手撸红黑树

 然后又发现,5和12节点颜色一样了(可怕...........)

接下来我们想进行上一步的做法,却发现,当前节点(也就是12)的叔叔(也就是30)是黑色,(尴尬......)

接下来可能要进行左旋或者是右旋了,

如果当前节点作为父节点的右子树,则进行左旋

如果当前节点作为父节点的左子树,则进行右旋

很明显,12这个节点为5节点的右子树,需要进行左旋.左旋之前,当前指针移动到当前节点的父节点(也就是5节点变为当前节点)

 左旋后的图(左旋不用更改颜色):

30分钟手撸红黑树

 接下来又发现,5和12节点颜色一样了,然后5节点的叔叔是黑色,要左旋或者右旋,但是5节点作为12的左子树,需要右旋

右旋需要注意:

1.先把爷爷变为12变为黑色,再把祖父变为红色

2.指针移到祖父,也就是当前节点变为19节点了

3.以当前节点19进行右旋

30分钟手撸红黑树

右旋后的图(右旋要改颜色):

30分钟手撸红黑树

 红黑树插入完成

其实右旋比左旋多了一步,就是改颜色,还有当前的节点变了

 

 

相关文章: