public void colorChange(Node<T> n) {
setcolor(n, 2);
// 如果当前节点父亲是红色且叔节点也是红色
while (n != null && n != root && colorof(parent(n)) == 2) {
// n的父亲是爷爷的左儿子
Node<T> parentleft = leftof(parent(parent(n)));
if (parent(n) == parentleft) {
// 当前节点的叔节点为爷爷的右儿子 颜色为红色
Node<T> y = rightof(parent(parent(n)));
if (y != null && colorof(y) == 2) {
// 将父节点设置为黑色
setcolor(parent(n), 1);
// 将叔节点设置为黑色
setcolor(y, 1);
// 将爷节点设置为红色
setcolor(parent(parent(n)), 2);
// 将n设置为爷节点
n = parent(parent(n));
} else {
//叔节点为黑色
// 当前节点是其父亲的右子节点
if (n == rightof(parent(n))) {
// 当前节点等于其父节点
n = parent(n);
//左旋转
leftRotate(n);
}
//爸爸在左 儿子也在左
// 将当前节点的父节点设置为黑色
Node pnode = parent(n);
setcolor(pnode, 1);
// 爷节点设置为红色
setcolor(parent(parent(n)), 2);
// 以爷节点为基准 右旋转
rightRotate(parent(parent(n)));
}
// n的父亲是爷爷的右儿子
} else {
// 叔节点
Node uncle = rightof(parent(parent(n)));
// 叔节点为红色
if (colorof(uncle) == 2) {
// 将父节点设置为黑色
setcolor(parent(n), 1);
// 将叔节点设置为黑色
setcolor(uncle, 1);
// 将爷节点设置为红色
setcolor(parent(parent(n)), 2);
// 将当前节点设置为当前节点的爷节点
n = parent(parent(n));
} else {
// 当前节点是父节点的左节点
if (n == leftof(parent(n))) {
n = parent(n);
// 以当前节点的父节点为基准 右旋转
rightRotate(n);
//以爷爷为轴右旋转
// leftRotate(parent(parent(n)));
// leftRotate(n);
}
// 将当前节点的父节点设置为黑色
setcolor(parent(n), 1);
// 爷节点设置为红色
setcolor(parent(parent(n)), 2);
// 以爷节点为基准 右旋转
leftRotate(parent(parent(n)));
}
}
}
setcolor(root, 1);
}![]()