TreeMap红黑树源码详解
Posted Android源码解析
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TreeMap红黑树源码详解相关的知识,希望对你有一定的参考价值。
红黑树的几个性质要先说一下,
1. 每个节点是红色或者黑色的。
2. 根节点是黑色的。
3. 每个叶节点的子节点是黑色的(叶子节点的子节点可以认为是null的)。
4. 如果一个节点是红色的,则它的左右子节点都必须是黑色的。
5. 对任意一个节点来说,从它到叶节点的所有路径必须包含相同数目的黑色节点。
TreeMap还有一个性质,就是他的左子树比他小,右子树比他大,这里的比较是按照key排序的。存放的时候如果key一样就把他替换了。
既然是棵树,那么肯定就会有put方法以及remove方法,那么这里就从最简单的着手,先看一下put方法
put方法存放的时候,首先是会存放到叶子节点,然后在进行调整。上面有一个重量级的方法fixAfterInsertion还没有分析,在分析fixAfterInsertion方法之前来看一下其他的几个方法,
下面再来看一下fixAfterInsertion方法
上面列出了6中可能,下面通过6张图来说明
下面是图1,不需要旋转,只需要调整颜色即可
下面是图2和图3,因为不平衡,所以需要旋转
下面是图4,和图1差不多,也分两种情况,一种是左节点一种是右节点
下面是图5和图6,因为不平衡,所以需要旋转
无论怎么旋转,他的左节点永远小于他,右节点永远大于他。通过不断的while循环,最终保证红黑树的平衡。下面来看一下旋转的方法,先看一下图
而右旋方法rotateRight和左旋差不多,这里就不在分析。put方法分析完了,那么下一个就是remove方法了,
下面再看一下删除方法deleteEntry。
上面分析的时候有两个方法successor和fixAfterDeletion没有分析,下面先来看一下successor方法,这个方法很简单,其实就是返回大于节点p的最小值,看一下代码
OK,下面再来看一下fixAfterDeletion方法,因为x所在分支少了一个黑色的节点,所以他的主要目的就是让x分支增加一个黑色节点。这个比fixAfterInsertion方法还难理解,看代码
结合上面代码看一下下面的四张图
OK,到现在为止put和move方法都已经分析完了,下面看一下其他方法,
再来看一下containsValue方法
再来看一个getCeilingEntry,这个方法比较绕
下面再来看一个和getCeilingEntry方法类似的方法getFloorEntry。
getHigherEntry函数和getCeilingEntry函数有点类似,不同点是如果有相同的key,getCeilingEntry会直接返回,而getHigherEntry仍然会返回比key大的最小节点,
同理getLowerEntry函数和getFloorEntry函数很相似,这里就不在详述。下面在看一个方法predecessor
OK,目前为止TreeMap主要方法都已整理完毕。
以上是关于TreeMap红黑树源码详解的主要内容,如果未能解决你的问题,请参考以下文章