public void insertItem(Object key, Object element)
      throws InvalidKeyException  {
    super.insertItem(key, element); // may throw an InvalidKeyException
    Position posZ = actionPos; // start at the insertion position
    T.replaceElement(posZ, new RBTItem(key, element, Red));
    if (T.isRoot(posZ))
      setBlack(posZ);
    else
      remedyDoubleRed(posZ);
  }

  protected void remedyDoubleRed(Position posZ)  {
    Position posV = T.parent(posZ);
    if (T.isRoot(posV))
      return;
    if (!isPosRed(posV))
      return;
    // we have a double red: posZ and posV
    if (!isPosRed(T.sibling(posV)))  { // Case 1: trinode restructuring
      posV = ((RestructurableNodeBinaryTree) T).restructure(posZ);
      setBlack(posV);
      setRed(T.leftChild(posV));
      setRed(T.rightChild(posV));
     }  
    else  { // Case 2: recoloring
      setBlack(posV);
      setBlack(T.sibling(posV));
      Position posU = T.parent(posV);
      if (T.isRoot(posU))
        return;
      setRed(posU);
      remedyDoubleRed(posU);
    }
  }