红黑树简单介绍
红黑树的作用
大 家都知道“树结构”在整个数据结构是比较重要的一种,它既有线性表的查找速度,也有链表结构的插入删除性能。不错,理想中的平衡二叉树确实这样,但是现实 中情况并不总这样如意。如果一组数据比较有序,如递增,或递减的出现,那整个树将变得极其不平衡起来,假如我们现在的一组数据 是:2,4,45,65,76,形成的树如下图:
这种树其实已经是一种链表结构了,查找复杂度为O(n)。
或许你想到办法了,对,就是这样。树变得不平衡了,我们必需使之再平衡起来。这就是笔者这篇文章要说的问题:平衡二叉树,有时也叫红黑树。
平衡规则:
- 每个结点不是红色就是黑色(这也是红黑树来由)
- 根结点总是黑色的
- 如果父结点是红色,则直接子结点必需是黑色(反之不一定)
- 树的深度(deepth)相同,即根到叶子结点(空叶子结点)的黑色结点数目相同
如果满足上面四条规则,树就一定平衡吗,有这么神奇吗?在这里,我们要一起感谢前辈们的智慧,他们确实想出了这个办法。任何的理论都要有充分的论证的,这里就不讨论怎么证明了。感兴趣的朋友可以网上搜下。
2、红黑树的实现
自上向下找到插入点时,检查当前结点是否是黑色且它的两个子节点都是红色。如果这样,则改变这三个节点的颜色(根节点必需是黑色),颜色变换之后,检查有没有违反规则三,如果有,则要执行适当的旋转,对外侧子孙点旋转一次,内侧子孙点要旋转两次。
看完这段算法的描述是不是头大了的感觉,不急,我们慢慢来一步步分析。
其实树的不平衡的根本原因是因为数据总是不那么的随机出现,导致树的一个分枝无限延长。看个例子:
就是这么简单,不过,还有种情你也要注意下:
也许看到这里,读者可以会说,就这么简单啊,可是很遗憾的告诉你,事情还没有完,我们只是考虑到了最简单的一种情况,即插入节点时导致的不平衡旋转。现在大家看如下图:
上图的意思就是想告诉大家,在插入的时候向下搜索路径的途中,如果当前节点为黑色及其它的两个子节点都为红色,则要改变它们的颜色(红变黑,黑变红,不过根节点一定要始终是黑色)。这样做的好处是在不违反规则四的前提下使新插入的节点更容易的插入。
讲到这里,事情变得越来越明朗,心情也high起来了是吧,但是还有点烦人的东西要给大家讲完。前面说过变颜色的问题,如果细心的读者可以已经注意到了,如果改变颜色使当前结点变为红色后,而此时该节点的父节点也是红色的话,则违反规则三。看下图就清楚了:
好了,这该死的网速,每上传一次讲解图片,要等半天。
其实到这里为此我已经把红黑树的算法分析完了。有兴趣的朋友可以多想想,在纸上多画画,搞清楚思路。
最后,我附上我写的一个简单的关于红黑树的算法,仅供大家参考下。
下载地址