public Object removeElement(Object key) throws InvalidKeyException {
Object toReturn = super.removeElement(key);
Position posR = actionPos;
if (toReturn != NO_SUCH_KEY) {
if (wasParentRed(posR) || T.isRoot(posR) || isPosRed(posR))
setBlack(posR);
else
remedyDoubleBlack(posR);
}
return toReturn;
}
protected void remedyDoubleBlack(Position posR) {
Position posX, posY, posZ;
boolean oldColor;
posX = T.parent(posR);
posY = T.sibling(posR);
if (!isPosRed(posY)) {
posZ = redChild(posY);
if (hasRedChild(posY)) { // Case 1: trinode restructuring
oldColor = isPosRed(posX);
posZ = ((RestructurableNodeBinaryTree) T).restructure(posZ);
setColor(posZ, oldColor);
setBlack(posR);
setBlack(T.leftChild(posZ));
setBlack(T.rightChild(posZ));
return;
}
setBlack(posR);
setRed(posY);
if (!isPosRed(posX)) { // Case 2: recoloring
if (!T.isRoot(posX))
remedyDoubleBlack(posX);
return;
}
setBlack(posX);
return;
} // Case 3: adjustment
if (posY == T.rightChild(posX))
posZ = T.rightChild(posY);
else
posZ = T.leftChild(posY);
((RestructurableNodeBinaryTree)T).restructure(posZ);
setBlack(posY);
setRed(posX);
remedyDoubleBlack(posR);
}