C++ 从二叉搜索树中删除一个节点

C++ Delete a node from binary search tree

这是我试图解决这个特定问题的地方: http://mycodeschool.com/work-outs/binary-search-trees/7

如果要删除的节点同时具有children,则采用的策略是用其左子树中的最大值替换该节点(我们称之为MAX_LEFT)。然后你可以简单地删除节点MAX_LEFT。我们针对此问题的视频中也讨论了此策略。

我正在尝试通过以下代码解决这个问题。但是有一些问题,我没有得到预期的输出。

struct Node
  {
     int data;
     struct Node* left;
     struct Node* right;
  }

Node* FindMax(Node* root)
{
    if(root==NULL)
    return NULL;

    while(root->right != NULL)
    {
        root = root->right;
    }
    return root;
}
Node* DeleteNodeInBST(Node* root,int data)
{
    if(root==NULL) return root;
    else if(data<=root->data) 
        root->left = DeleteNodeInBST(root->left, data);
    else if (data> root->data)
        root->right = DeleteNodeInBST(root->right, data);
    else
    {
        //No child
        if(root->right == NULL && root->left == NULL)
        {
            delete root;
            root = NULL;   
        }
        //One child 
        else if(root->right == NULL)
        {
            Node* temp = root;
            root= root->left;
            delete temp;
        }
        else if(root->left == NULL)
        {
            Node* temp = root;
            root= root->right;
            delete temp;
        }
        //two child
        else
        {
            Node* temp = FindMax(root->left);
            root->data = temp->data;
            root->left = DeleteNodeInBST(root->left, temp->data);
        }
    }
    return root;
}

在下面的代码段中,在2个else if语句之后,final else语句永远不会执行,因为没有其他可能:

 else if(data<=root->data) 
        root->left = DeleteNodeInBST(root->left, data);
 else if (data> root->data)
        root->right = DeleteNodeInBST(root->right, data);
 else
        ....

这部分

if(data<=root->data)
    root->left = DeleteNodeInBST(root->left, data);
else
    ...
data 等于 当前节点 root 时,

也会下移到左子树。因此,您将 永远不会 到达第三个 else。尝试将 <= 替换为 <.

知道了。我必须删除 "else if(data<=root->data)" 中的“=”,然后才能正常工作。