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); }