Java数据结构之红黑树的真正理解数据结构之红黑树的真正理解
主要为大家详细介绍了Java数据结构之红黑树的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
真正的帮助大家理解红黑树:
一、红黑树所处数据结构的位置:一、红黑树所处数据结构的位置:
在JDK源码中, 有treeMap和JDK8的HashMap都用到了红黑树去存储
红黑树可以看成B树的一种:
从二叉树看,红黑树是一颗相对平衡的二叉树
二叉树-->搜索二叉树-->平衡搜索二叉树--> 红黑树
从N阶树看,红黑树就是一颗 2-3-4树
N阶树-->B(B-)树
故我提取出了红黑树部分的源码,去说明红黑树的理解
看之前,理解红黑树的几个特性,后面的操作都是为了让树符合红黑树的这几个特性,从而满足对查找效率的O(logn)
二、红黑树特性,以及保持的手段二、红黑树特性,以及保持的手段
1.根和叶子节点都是黑色的
2.不能有有连续两个红色的节点
3.从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点
这几个特效,个人理解就是规定了红黑树是一颗2-3-4的B树了,从而满足了O(logn)查找效率
保持特性的手段,通过下面这些手段,让红黑树满足红黑树的特性,如果要尝试理解,可以从2-3-4树的向上增长,后面有详细介绍
当然,这些改变也都是在O(logn)内完成的,主要改变方式有
1.改变颜色
2.左旋
3.右旋
三、从三、从JDK源码来理解源码来理解
主要看我的注释,逻辑的理解
先看TreeMap
//对treeMap的红黑树理解注解. 2017.02.16 by 何锦彬 JDK,1.7.51<br> <br>/** From CLR */
private void fixAfterInsertion(Entry<K, V> x) {
//新加入红黑树的默认节点就是红色
x.color = RED;
/**
* 1. 如为根节点直接跳出
*/
while (x != null && x != root && x.parent.color == RED) {
if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
//如果X的父节点(P)是其父节点的父节点(G)的左节点
//即 下面这种情况
/**
* G
* P(RED) U
*/
//获取其叔(U)节点
Entry<K, V> y = rightOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
// 这种情况,对应下面 图:情况一
/**
* G
* P(RED) U(RED)
* X
*/
//如果叔节点是红色的(父节点有判断是红色). 即是双红色,比较好办,通过改变颜色就行. 把P和U都设置成黑色然后,X加到P节点。 G节点当作新加入节点继续迭代
setColor(parentOf(x), BLACK);
setColor(y, BLACK);