private void PromoteNode(TreeNode oldNode, TreeNode promoted)
{
if (promoted.Right != null || promoted.Left != null)
throw new InvalidOperationException("promoted node can not have child nodes, remove node from tree before promoting");
promoted.Right = oldNode.Right;
promoted.Left = oldNode.Left;
if (root == oldNode)
root = promoted;
else
ReplaceNode(oldNode, promoted);
}