正在删除二进制搜索树中具有两个子节点的节点

Deleting node with two children in binary search tree

本文关键字:两个 子节点 节点 删除 二进制 搜索树      更新时间:2023-10-16

我正试图删除一个有两个子节点的节点。然而,我的功能并不是从树中完全删除节点,而是留下一个重复节点。

以下是我的功能:

void Remove(Node *&r, int idx)
{
    if(Search(r, idx))
    {
        if(idx < r->id)      Remove(r->left, idx);
        else if(idx > r->id) Remove(r->right, idx);
        else                 DeleteNode(r);
        //cout << "Account " << idx << " is now closed.";
    }
    else cout << "Account does not exist." << endl;
}
void DeleteNode(Node *&r)
{
    Node *temp = r;
    if(r->left == NULL && r->right != NULL) 
    {
        r = temp->right;
        delete temp;
        temp = NULL;
    }
    else if(r->left != NULL && r->right == NULL) 
    {
        r = temp->left; 
        delete temp;
        temp = NULL;
    }
    else if(r->left == NULL && r->right == NULL)
    {
        r = NULL;
        delete r;
    }
    else 
    {
        // go to left of r and find largest value
        temp = FindMax(r->left);
        int    tempID        = temp->id; 
        float  tempBal       = temp->balance;
        string tempString    = temp->name; 
        DeleteNode(temp);   
        r->id = tempID; 
        r->balance = tempBal;
        r->name = tempString;
    }
}
Node* FindMax(Node *t)
{
    while(t->right != NULL) 
    {
        t = t->right;
    }
    return t;
}

假设我有这棵树:

          33
    22          44 
11      25  

删除22会导致以下情况:

          33
    22          44 
22      25  
temp = FindMax(r->left);

不是你想做的。当你DeleteNode(temp)时,旧节点仍然在树中,但temp被覆盖了。您打算覆盖父级的right成员。