jdk 1.8 HashMap中所用的红黑树是由2-3-4树演变过来的。下面是描述2-3-4树是什么,以及2-3-4树生成原理和红黑树关系。
2-3-4树 是指 2树、3树、4树的集合
-
2树是有一个元素和两个子节点的树。下图是简单的2树,他的元素是3,子节点分别是 2和4。
-
3树是有两个元素和三个子节点的树。下图是3树,他的元素是[3,5],子节点分别是 2和4和[6,7,8]。
-
4树是有三个个元素和四个子节点的树。下图是4树,他的元素是[3,5,7],子节点分别是 2、4、6、 [8,9]。
2-3-4树的生成过程
假设有一个数组 [2,3,4,5,6,7,8,9,10,11,12,1],我们需要把它变为2-3-4树。下面罗列每个步骤流程。
-
添加元素 2,3,4
当树的元素没有超过3个的时候,新加的元素直接放在一个数组中,如下图。
-
继续添加元素5
下一步就需要把5加入树中。如下图,可以看到4树最多只有3个元素,现在已经超出了,需要对树进行调整。
-
超出3个元素的节点调整规则如下。
原来是 [2,3,4]现在加入5,得到[2,3,4,5],长度超出3个,需要把第二个元素提出来,放到父节点。然后剩下两个元素分别作为左右节点。这个过程暂且称为裂变,提出以后结构如下图所示。
-
插入元素6
-
插入元素7
-
调整节点
右节点超出4树标准,继续对右节点 [4,5,6,7] 进行裂变。得到下图的节点。
-
融合节点
把步骤6 得到的节点和之前节点融合【注意这里需要把提取的元素 5和原来的父节点元素3,融合在一起】,得到下图结构。
-
插入元素8
-
插入元素9
-
重复裂变操作
-
插入元素10
-
插入元素11
-
重复裂变操作
这里我们把9往上提的时候会发现,父节点也超出了3个元素,所以这里需要对父节点也进行裂变操作 -
对父节点进行裂变操作
-
重新为父节点分配子节点
分配规则如下:小于父节点的,放在左边。大于父节点的,放在右边。
-
插入元素12
-
插入元素1
上述流程是为了简化步骤,所以数字都是递增的,其实每插入一个元素都是要,查找适合的位置存放,条件就是 左边元素 < 新元素 < 右边元素。所以现在插入1,插入位置如下所示。
最终结构如下:
下一篇继续2-3-4树和红黑树关系。