/** From CLR **/ private RBCell fixAfterDeletion(RBCell rootValue) { RBCell x = this; while (x != rootValue && colorOf(x)) { if (x == leftOf(parentOf(x))) { RBCell sib = rightOf(parentOf(x)); if (!colorOf(sib)) { setColor(sib, BLACK); setColor(parentOf(x), RED); rootValue = parentOf(x).rotateLeft(rootValue); sib = rightOf(parentOf(x)); } if (colorOf(leftOf(sib)) && colorOf(rightOf(sib))) { setColor(sib, RED); x = parentOf(x); } else { if (colorOf(rightOf(sib))) { setColor(leftOf(sib), BLACK); setColor(sib, RED); rootValue = sib.rotateRight(rootValue); sib = rightOf(parentOf(x)); } setColor(sib, colorOf(parentOf(x))); setColor(parentOf(x), BLACK); setColor(rightOf(sib), BLACK); rootValue = parentOf(x).rotateLeft(rootValue); x = rootValue; } } else // symmetric { RBCell sib = leftOf(parentOf(x)); if (!colorOf(sib)) { setColor(sib, BLACK); setColor(parentOf(x), RED); rootValue = parentOf(x).rotateRight(rootValue); sib = leftOf(parentOf(x)); } if (colorOf(rightOf(sib)) && colorOf(leftOf(sib))) { setColor(sib, RED); x = parentOf(x); } else { if (colorOf(leftOf(sib))) { setColor(rightOf(sib), BLACK); setColor(sib, RED); rootValue = sib.rotateLeft(rootValue); sib = leftOf(parentOf(x)); } setColor(sib, colorOf(parentOf(x))); setColor(parentOf(x), BLACK); setColor(leftOf(sib), BLACK); rootValue = parentOf(x).rotateRight(rootValue); x = rootValue; } } } setColor(x, BLACK); return(rootValue); }
/** From CLR **/ private RBCell fixAfterInsertion(RBCell rootValue) { this.colorValue = RED; RBCell x = this; while (x != null && x != rootValue && !x.parentValue.colorValue) { if (parentOf(x) == leftOf(parentOf(parentOf(x)))) { RBCell y = rightOf(parentOf(parentOf(x))); if (!colorOf(y)) { setColor(parentOf(x), BLACK); setColor(y, BLACK); setColor(parentOf(parentOf(x)), RED); x = parentOf(parentOf(x)); } else { if (x == rightOf(parentOf(x))) { x = parentOf(x); rootValue = x.rotateLeft(rootValue); } setColor(parentOf(x), BLACK); setColor(parentOf(parentOf(x)), RED); if (parentOf(parentOf(x)) != null) { rootValue = parentOf(parentOf(x)).rotateRight(rootValue); } } } else { RBCell y = leftOf(parentOf(parentOf(x))); if (!colorOf(y)) { 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); rootValue = x.rotateRight(rootValue); } setColor(parentOf(x), BLACK); setColor(parentOf(parentOf(x)), RED); if (parentOf(parentOf(x)) != null) { rootValue = parentOf(parentOf(x)).rotateLeft(rootValue); } } } } rootValue.colorValue = BLACK; return(rootValue); }