public BinarySearchTreeNode <T> RemoveNode(U targetkey)
            {
                if (_rtnd == null)
                {
                    throw new NotFound();
                }
                BinarySearchTreeNode <T> vNode = new BinarySearchTreeNode <T>(_rtnd.Data, null, _rtnd); //virtual node that is the parent of root node;
                pcnPair <T> delPair            = SearchPair(targetkey, vNode);

                if (delPair.cNode.IsTerminal())
                {
                    if (delPair.pNode.Left == delPair.cNode)
                    {
                        return((BinarySearchTreeNode <T>)delPair.pNode.RemoveLeftSubtree());
                    }
                    else
                    {
                        return((BinarySearchTreeNode <T>)delPair.pNode.RemoveRightSubtree());
                    }
                }
                else if (delPair.cNode.IsLeftEmpty())
                {
                    delPair.cNode.Data = delPair.cNode.DeleteRightMinKeyNode().cNode.Data;
                }
                else
                {
                    delPair.cNode.Data = delPair.cNode.DeleteLeftMaxKeyNode().cNode.Data;
                }
                _rtnd = vNode.Right;
                vNode.Dispose();
                return(delPair.cNode);
            }