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

时间:2015-07-30 05:28:34

标签: c++ binary-search-tree

这是我试图解决这个特定问题的地方: 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;
}

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

这部分

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

也将逐步降低到左子树。因此,您永远不会到达第三个else。尝试将<=替换为<

答案 2 :(得分:1)

知道了。我必须删除&#34; =&#34; in&#34;否则if(data&lt; = root-&gt; data)&#34;然后就可以了。