R-B Tree
简介
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的平衡二叉树,在java中,TreeMap和HashMap都有用到它。
特性
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
旋转
红黑树的旋转只有两种,左旋和右旋,比平衡二叉树少了两种。
// Rotate Left
private void rotateLeft(Entry<K,V> p) {
if (p != null) {
Entry<K,V> r = p.right;
p.right = r.left;
if (r.left != null)
r.left.parent = p;
r.parent = p.parent;
if (p.parent == null)
root = r;
else if (p.parent.left == p)
p.parent.left = r;
else
p.parent.right = r;
r.left = p;
p.parent = r;
}
}
//Rotate Right
private void rotateRight(Entry<K,V> p) {
if (p != null) {
Entry<K,V> l = p.left;
p.left = l.right;
if (l.right != null) l.right.parent = p;
l.parent = p.parent;
if (p.parent == null)
root = l;
else if (p.parent.right == p)
p.parent.right = l;
else p.parent.left = l;
l.right = p;
p.parent = l;
}
}
插入调整
//红黑树调整函数fixAfterInsertion()
// 定义变换条件为偏序(p==,y==,pp==,x==)
// 定义变换向量为偏序(p=>,y=>,pp=>,x=,{})
// 定义偏序中0为条件忽略。
private void fixAfterInsertion(Entry<K,V> x) {
x.color = RED;
while (x != null && x != root && x.parent.color == RED) {
if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
// 父节点为左节点(p==pp->left)
// 此时有三种情况
Entry<K,V> y = rightOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
//当y为null时,视为BLACK
// 若父亲p为左节点(p==pp->left),
// 若大伯y(pp->other)为R,
// 那么为情况1.(p==left,y==R,0,0)--->(p=>B,y=>B,pp=>R,x=pp,{0})
setColor