写这篇文章的过程中看过了以下几篇博客,并学习里面的思路编写该文章
https://baijiahao.baidu.com/s?id=1641940303518144126&wfr=spider&for=pc
https://www.cnblogs.com/skywang12345/p/3245399.html
https://www.jianshu.com/p/84416644c080(个人觉得这篇文章将删除操作总结得很好)
什么是红黑树:
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树具有良好的效率,它可在 O(logN)
时间内完成查找、增加、删除等操作。而且红黑树的应用很广泛,Java JDK 1.8 中的 TreeMap、 HashMap以及C++ STL 中的 map 均是基于红黑树结构实现的。因此,学习红黑树对我们理解语言底层代码有一定帮助。既然红黑树与二叉查找树有关,那么先来了解什么是二叉查找树。
什么是二叉查找树:
通过上图可以发现二叉查找树有以下特点:
1.左子树上所有节点的值均小于或等于它根节点的值。
2.右子树上所有节点的值均大于或等于它根节点的值。
3.左右子树一定分别为二叉排序树。
二叉查找树查询操作:
了解过二分查找算法的看了上图肯定会发现了,在二叉查找树中查询一个值是否存在的过程与时间复杂度和二分查找是一样的。
例如需要查找22这个值:
1.首先将22与根节点12比较,22>12,因此继续在右子树寻找节点。
2.在右子树中与根节点15比较,22>15,因此继续在右子树寻找节点。
3.在右子树中与根节点20比较,22>20,因此继续在右子树寻找节点。
4.在右子树中找到了22,结束查找。
通过这个查找过程可以发现,查询的最大次数等于二叉查找树的层数。
二叉查找树的缺陷:
通过上图可以发现,二叉查找树的左右子树有可能在插入数据后变成一条线性表而不是树结构,这时,便可以通过红黑树算法对树的结构进行平衡。
什么是红黑树:
红黑树就是一种平衡的二叉查找树,平衡的意思是让给树不会左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,先讲上图转换为红黑树来研究红黑树的特点,通过下图可以发现还具体下列的规则:
1. 节点是红色或者黑色
2. 根节点是黑色
3. 每个叶子的节点都是黑色的NULL空节点(黑色的NULL空节点可忽略不画)
4. 每个红色节点的两个子节点都是黑色的。
5. 从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点。同时,确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。(如上图中红黑树,从根节点12到达每个空叶子节点的距离均进过3个黑点;例如,叨到达最左边的叶子节点的路径是12->5->2->1->Null)
注:要求新加入到红黑树的节点为红色节点。
如果对红黑树进行插入或删除节点的操作有可能破坏红黑树的结构,结构破坏后,就需要用到着色、左旋、右旋这三种操作,着色顾名思义就是将红色变成黑色,黑色变成红色;而左旋与右旋则结合下面的图片进行讲解:
左旋操作:
左旋的三步操作 :
1.旧父节点的右子节点变新父节点。(如上图的15)
2.旧父节点变新父节点的左子节点。(如上图的12)
3.新父节点的原左子变旧父节点的右子节点。(如上图的13)
总的来说,就是:旧爹右子变新爹;旧爹变左子;新爹原左子变新爹右子。
右旋操作:
右旋操作与左旋操作相反 ,左旋的三步操作 :
1.旧父节点的左子节点变新父节点。(如上图的12)
2.旧父节点变新父节点的右子节点。(如上图的15)
3.新父节点的原右子变旧父节点的左子节点。(