TreeMap红黑树源码详解

Posted Android源码解析

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TreeMap红黑树源码详解相关的知识,希望对你有一定的参考价值。

红黑树的几个性质要先说一下,

1. 每个节点是红色或者黑色的。
2. 根节点是黑色的。
3. 每个叶节点的子节点是黑色的(叶子节点的子节点可以认为是null的)。
4. 如果一个节点是红色的,则它的左右子节点都必须是黑色的。
5. 对任意一个节点来说,从它到叶节点的所有路径必须包含相同数目的黑色节点。

TreeMap还有一个性质,就是他的左子树比他小,右子树比他大,这里的比较是按照key排序的。存放的时候如果key一样就把他替换了。


既然是棵树,那么肯定就会有put方法以及remove方法,那么这里就从最简单的着手,先看一下put方法

TreeMap红黑树源码详解

TreeMap红黑树源码详解

put方法存放的时候,首先是会存放到叶子节点,然后在进行调整。上面有一个重量级的方法fixAfterInsertion还没有分析,在分析fixAfterInsertion方法之前来看一下其他的几个方法,

TreeMap红黑树源码详解

下面再来看一下fixAfterInsertion方法

TreeMap红黑树源码详解

TreeMap红黑树源码详解

上面列出了6中可能,下面通过6张图来说明

下面是图1,不需要旋转,只需要调整颜色即可

TreeMap红黑树源码详解

下面是图2和图3,因为不平衡,所以需要旋转

TreeMap红黑树源码详解

下面是图4,和图1差不多,也分两种情况,一种是左节点一种是右节点

TreeMap红黑树源码详解

下面是图5和图6,因为不平衡,所以需要旋转

TreeMap红黑树源码详解

无论怎么旋转,他的左节点永远小于他,右节点永远大于他。通过不断的while循环,最终保证红黑树的平衡。下面来看一下旋转的方法,先看一下图

TreeMap红黑树源码详解

TreeMap红黑树源码详解

而右旋方法rotateRight和左旋差不多,这里就不在分析。put方法分析完了,那么下一个就是remove方法了,

TreeMap红黑树源码详解

下面再看一下删除方法deleteEntry。

TreeMap红黑树源码详解

TreeMap红黑树源码详解

上面分析的时候有两个方法successor和fixAfterDeletion没有分析,下面先来看一下successor方法,这个方法很简单,其实就是返回大于节点p的最小值,看一下代码

TreeMap红黑树源码详解

OK,下面再来看一下fixAfterDeletion方法,因为x所在分支少了一个黑色的节点,所以他的主要目的就是让x分支增加一个黑色节点。这个比fixAfterInsertion方法还难理解,看代码

TreeMap红黑树源码详解

TreeMap红黑树源码详解

结合上面代码看一下下面的四张图

TreeMap红黑树源码详解

TreeMap红黑树源码详解

TreeMap红黑树源码详解

TreeMap红黑树源码详解

OK,到现在为止put和move方法都已经分析完了,下面看一下其他方法,

TreeMap红黑树源码详解

再来看一下containsValue方法

TreeMap红黑树源码详解

再来看一个getCeilingEntry,这个方法比较绕

TreeMap红黑树源码详解

下面再来看一个和getCeilingEntry方法类似的方法getFloorEntry。

TreeMap红黑树源码详解

getHigherEntry函数和getCeilingEntry函数有点类似,不同点是如果有相同的key,getCeilingEntry会直接返回,而getHigherEntry仍然会返回比key大的最小节点,


同理getLowerEntry函数和getFloorEntry函数很相似,这里就不在详述。下面在看一个方法predecessor

OK,目前为止TreeMap主要方法都已整理完毕。

以上是关于TreeMap红黑树源码详解的主要内容,如果未能解决你的问题,请参考以下文章

Java - HashTree源码解析 + 红黑树

TreeMap关键源码解析-红黑树操作

Java集合详解6:TreeMap和红黑树

JAVA集合:TreeMap红黑树深度解析

TreeMap源码剖析

结合java.util.TreeMap源码理解红黑树