高效搜索数据结构之红黑树简介

Posted java初学者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效搜索数据结构之红黑树简介相关的知识,希望对你有一定的参考价值。

之前介绍java中的HashMap时有说到过红黑树,今天就来讲讲红黑树。


首先学习红黑树之前要了解二叉树以二叉搜索树。


二叉树是一种基本的数据结构,本身结构也很简单,结构如下图所示:

图(1)


上图所示就是一个简单的二叉树,每个节点都最多有两个子节点(可以为空),每个节点最多有一个父节点(根节点没有父节点),其中1就是根节点。


而二叉搜索树就是在二叉树的基础上构建的满足以下条件的特殊二叉树:


1、每个节点的左子节点必须比该节点小;

2、每个节点的右子节点必须大于等于该节点;


满足以上条件的二叉树就可以算是一个二叉搜索树了。


例如以5 , 3 , 9 , 3 , 2 , 8为数据构建一个二叉搜索树,如下图所示:


高效搜索数据结构之红黑树简介

图(2)


或者下图:

图(3)



总之,只要满足以上规则的二叉树都可以叫做二叉搜索树。


那么,为什么要用二叉搜索树?


答案就是二叉搜索树对于插入、查找等基本操作有较好的期望时间,对于一个有n各节点的完全二叉树,以上基本操作都可以在以2为底n的对数的时间复杂度中完成,而如果是普通遍历查找的话则需要线性时间O(n)完成,差距还是比较明显的,特别是在数据量大的时候。



那么,普通二叉搜索树有什么缺点呢?那就是普通的二叉搜索树没办法保证树一直是完全二叉树(参考图二),也就是说在最坏的情况下(所有数据全部跑到一个分支上)普通二叉搜索树跟遍历查找是一样的。


既然二叉搜索树的效率这么高,就因为这个缺点要放弃吗?答案肯定是no,前人也是很机智的,他们发现了这个缺点后,基于二叉搜索树又升级了平衡树,而红黑树就是平衡树中的一种,下面我们开始进入正题:红黑树的讲解。


首先是红黑树为什么叫红黑树?为啥不叫黑白树,不叫蓝绿树,而是叫红黑树呢?其实红黑树的名字是因为跟红黑树的定义有关的,你自己也可以叫黑白树,蓝绿树甚至彩虹树都行,只要满足下列特性就行:


1、每个节点只能是红色或者黑色(你可以自己设定为黑色和白色,或任意你自己喜欢的颜色,只需要将下列约束保持一致即可,当初定义这个的应该是比较喜欢红黑的~~)。


2、根节点必须是黑色。


3、每个叶节点都是黑色的。


4,、如果一个节点是红色的,那么他的两个子节点必须是黑色的。


5、对于每个节点,从该节点到其他所有后代叶节点的简单路径上,均包含相同数目的黑色节点。


由于红黑树的插入和删除操作对树做了修改,结果可能使新树违反上述性质,所以为了维护这些性质,必须要改变树中某些节点的颜色和指针结构。


指针结构可以通过旋转来完成,这是一种能保持二叉搜索树性质的搜索树局部操作。具体操作如下:



可以看出,操作前后并没有违反二叉搜索树的性质,但是改变了二叉搜索树的结构。


在需要插入和删除的时候通过该操作进行一些简单的变换加上颜色的变换就可以完成插入或者删除,同时不破坏现有红黑树的性质,有兴趣的可以自行看一下具体操作,基本上插入和删除就是对所有可能的情况进行了枚举,然后做出相应的操作。(注:插入和删除总共也就七种情况,所以并不是太多,可以枚举一波)


由于红黑树的性质可以保证红黑树始终是完全二叉树,所以红黑树的搜索删除等基本操作最坏时间复杂度也就是以2为底n的对数,所以红黑树是一种真正比较高效的数据结构(普通二叉搜索树是看运气,不能保证始终是完全二叉树)。



由于篇(时)幅(间)有限(加上懒~),所以红黑树就先做一个简单的介绍,后续有时间了再深入介绍(把那七种情况罗列一下)。



最后给出一点儿建议:在java编程时(使用JDK8及以上),如果需要使用Map,在需要根据key排序的时候不用想,就用TreeMap,但是如果对存放数据的顺序(遍历顺序)没有要求时,最好使用HashMap,正常情况下HashMap搜索效率都会比TreeMap高,及时碰到Hash攻击,在JDK8的实现下最坏也就是跟TreeMap持平,所以如果对遍历顺序没有要求的话最好是使用HashMap,但是如果需要有序遍历的话就直接用TreeMap,也不需要手动排序了。

以上是关于高效搜索数据结构之红黑树简介的主要内容,如果未能解决你的问题,请参考以下文章

C++从入门到入土第二十二篇:数据结构之红黑树

C++从入门到入土第二十二篇:数据结构之红黑树

C++从入门到入土第二十二篇:数据结构之红黑树

C++从入门到入土第二十二篇:数据结构之红黑树

0043数据结构之红黑树

数据结构之红黑树