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