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

C++ Delete a node from binary search tree

本文关键字:一个 节点 删除 搜索树      更新时间:2023-10-16

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

如果要删除的节点有两个子节点,则采用的策略是将该节点替换为其左子树中的最大值(我们称之为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;
}

这部分

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

也将向下步进到左子树。因此,您将永远不会到达第三个else。尝试用<代替<=

在下面的代码段中,在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
        ....

明白了。我必须删除"="在"else if(data<=root->data)",然后它的工作