private void removeNode(BinaryNode<T> nodeToRemove, BinaryNode<T> parentNode)
{
   BinaryNode<T> childNode;

   if (nodeToRemove.hasLeftChild())
      childNode = nodeToRemove.getLeftChild();
   else
      childNode = nodeToRemove.getRightChild();

   // Assertion: if nodeToRemove is a leaf, childNode is null
   assert (nodeToRemove.isLeaf() && childNode == null) || !nodeToRemove.isLeaf();

   if (nodeToRemove == getRootNode())
      setRootNode(childNode);
   else if (parentNode.getLeftChild() == nodeToRemove)
      parentNode.setLeftChild(childNode);
   else
      parentNode.setRightChild(childNode);
} // end removeNode
// Version 4.0
