/** Creates a new tree node. */
protected BTPosition createNode(Object element, BTPosition parent,
BTPosition left, BTPosition right) {
return new RBNode(element,parent,left,right); // a red-black node
}
public Entry insert(Object k, Object x) throws InvalidKeyException {
Entry toReturn = super.insert(k, x);
Position posZ = actionPos; // start at the insertion position
setRed(posZ);
if (isRoot(posZ))
setBlack(posZ);
else
remedyDoubleRed(posZ); // fix a double-red color violation
return toReturn;
}
protected void remedyDoubleRed(Position posZ) {
Position posV = parent(posZ);
if (isRoot(posV))
return;
if (!isPosRed(posV))
return;
// we have a double red: posZ and posV
if (!isPosRed(sibling(posV))) { // Case 1: trinode restructuring
posV = restructure(posZ);
setBlack(posV);
setRed(left(posV));
setRed(right(posV));
}
else { // Case 2: recoloring
setBlack(posV);
setBlack(sibling(posV));
Position posU = parent(posV);
if (isRoot(posU))
return;
setRed(posU);
remedyDoubleRed(posU);
}
}