一、2-3树
1.1 2-3树的特征
1. 每个节点都可以存放一个元素或者两个元素
2.存放一个元素的节点称为2-节点、存放两个元素的节点叫做3-节点
3.每个节点有2个或者3个子节点的树称为2-3树,2-3树满足二叉搜索树的基本性质
4.2-3树是一个绝对平衡的树(叶子节点高度差为0)
1.2 2-3节点添加
二、2-3树和红黑树等价性
2.1 2-3树等价转换红黑树
下面图1的2-3树等价于图2的红黑树
图1 图2
三、左倾红黑树的定义
1.红黑树的每个节点或是红色或者是黑色
2.根节点是黑色的,红色节点向左倾斜
3.每个叶子节点都是黑色的
4.如果一个节点是红色的,那么他的孩子节点都是黑色的
5.从任何一个节点到叶子节点,经过的黑色节点是一样的
3.1 红黑树节点的添加
根据2-3树的添加过程,可以看出与其等价的红黑树每个添加的节点都是红色
3.1.1 左旋
3.1.2 颜色翻转
3.1.3 右旋
3.1.4 添加节点汇总
四、TreeMap中红黑树源码
private void fixAfterInsertion(Entry<K,V> x) {
x.color = RED;
while (x != null && x != root && x.parent.color == RED) {
//x的爷爷节点的左孩子是x的父级节点,x的父级节点是红色
if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
Entry<K,V> y = rightOf(parentOf(parentOf(x)));//x的父级节点的兄弟节点
if (colorOf(y) == RED) {//而且x的父级节点的兄弟节点也是红色
//颜色翻转
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == rightOf(parentOf(x))) {//x是父级节点的右孩子
//左旋操作
x = parentOf(x);
rotateLeft(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
//右旋操作
rotateRight(parentOf(parentOf(x)));
}
} else {
Entry<K,V> y = leftOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == leftOf(parentOf(x))) {
x = parentOf(x);
rotateRight(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
rotateLeft(parentOf(parentOf(x)));
}
}
}
root.color = BLACK;
}