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