static <K,V> TreeNode<K,V> balanceInsertion(TreeNode<K,V> root,
TreeNode<K,V> x) {
x.red = true;
for (TreeNode<K,V> xp, xpp, xppl, xppr;;) { // x新节点 , xp父节点,xpp祖父节点,
if ((xp = x.parent) == null) { // 新节点的父节点为空,说明新节点上是根节点,黑树
x.red = false;
return x;
}
else if (!xp.red || (xpp = xp.parent) == null) // 父节点是黑树且祖父节点为空,父节点是根节点 黑树
return root;
if (xp == (xppl = xpp.left)) { // 父节点是祖父的左节点
if ((xppr = xpp.right) != null && xppr.red) {
xppr.red = false;
xp.red = false;
xpp.red = true;
x = xpp;
}
else {
if (x == xp.right) { // 新节点是父节点的右节点
root = rotateLeft(root, x = xp);
xpp = (xp = x.parent) == null ? null : xp.parent;
}
if (xp != null) {
xp.red = false;
if (xpp != null) {
xpp.red = true;
root = rotateRight(root, xpp);
}
}
}
}
static <K,V> TreeNode<K,V> rotateLeft(TreeNode<K,V> root,
TreeNode<K,V> p) {
TreeNode<K,V> r, pp, rl;
if (p != null && (r = p.right) != null) { // 父节点的右节点是子节点r
if ((rl = p.right = r.left) != null) // 子节点的左节点等于父节点的右节点
rl.parent = p; // 父节点左旋变成r的子节点
if ((pp = r.parent = p.parent) == null) // 父节点都为空,当前根节点
(root = r).red = false;
else if (pp.left == p) // 父节点是祖父的左节点
pp.left = r; // 子节点是祖父节点的左节点
else
pp.right = r;// 子节点是祖父节点的右节点
r.left = p; // 原先的父节点左旋变成r的左节点
p.parent = r; // r变成p的父节点
}
return root;
}
记:2021.05.06 17:12 周四