红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]
static <K,V> TreeNode<K,V> balanceInsertion(TreeNode<K,V> root,
TreeNode<K,V> x) {
x.red = true;//当新添加一个节点到树中后,将其颜色置为red
//开始循环,xp为x的父亲,xpp为x的爷爷,
//xppl为x的爷爷的左孩子,xppr为x的爷爷的右孩子
for (TreeNode<K,V> xp, xpp, xppl, xppr;;) {
if ((xp = x.parent) == null) {//1、 当插入的节点的父节点为null,则将该节点颜色置为black。
x.red = false;
return x;
}
else if (!xp.red || (xpp = xp.parent) == null)//2、 当插入节点的父节点颜色为black或者x的爷爷为空,不需要调整。
return root;
//走到这里说明父节点为红色
if (xp == (xppl = xpp.left)) {//x的父节点为x爷爷的左孩子
//3、当爷爷的右节点不为空并且是红色,也就是说爷爷下面的两个子节点都为红,直接把
//父节点和叔父节点置为black,同时将祖父节点置为red,将爷爷节点设置为当前新增节点,循环继续调整。
if ((xppr = xpp.right) != null && xppr.red) {
xppr.red = false;
xp.red = false;
xpp.red = true;
x = xpp;
}
else {//叔父节点为空或者叔父节点为黑色
if (x == xp.right) {//插入节点为父节点的右节点同时父亲节点是祖父节点的左孩子,则进行左旋
//此时树结构为xpp==>左xp==>右x
root = rotateLeft(root, x = xp);
//此时树结构为xpp==>左r==>左(x和xp)
xpp = (xp = x.parent) == null ? null : xp.parent;
//此时树结构为xpp==>左xp(原来的x)==>左x(原来的xp)
}
if (xp != null) {
xp.red = false;//此时树结构为xpp==>左xp(黑)==>左x(红)
if (xpp != null) {
xpp.red = true;//此时树结构为xpp(红)==>左xp(黑)==>左x(红)
root = rotateRight(root, xpp);
//xppp==>左xp(黑)==>左x(红)
// ==>右xpp(红)
}
}
}
}
else {//否则父节点为爷爷的右节点
//当爷爷的左节点不为空并且是红色,也就是说爷爷下面的两个子节点都为红,直接把
//父节点和叔父节点置为black,同时将祖父节点置为red,将爷爷节点设置为当前新增节点,循环继续调整。
if (xppl != null && xppl.red) {
xppl.red = false;
xp.red = false;
xpp.red = true;
x = xpp;
}
else {//叔父节点为空或者叔父节点为黑色
if (x == xp.left) {//插入节点为父节点的左节点同时父亲节点是祖父节点的右孩子,则进行右旋
//此时树结构为xpp==>右xp==>左x
root = rotateRight(root, x = xp);
//此时树结构为xpp==>右l==>右(x和xp)
xpp = (xp = x.parent) == null ? null : xp.parent;
//此时树结构为xpp==>右xp(原来的x)==>右x(原来的xp)
}
if (xp != null) {
xp.red = false;//此时树结构为xpp==>右xp(黑)==>右x(红)
if (xpp != null) {
xpp.red = true;//此时树结构为xpp(红)==>右xp(黑)==>右x(红)
root = rotateLeft(root, xpp);
//xppp==>右xp(黑)==>右x(红)
// ==>左xpp(红)
}
}
}
}
}
}
红黑树在线生成链接:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
雪皓梅丹的HashMap分析之红黑树树化过程:https://www.cnblogs.com/finite/p/8251587.html