为什么此代码用于删除BST中的节点,而不是删除使其变为0

void Delete(Node* &root,int data){
    if(root == NULL)
            return;
    if(root -> key > data)
            Delete(root->left,data);
    else if(root -> key < data)
            Delete(root->right,data);
    else{
            // key found ;
            if(root-> left == NULL && root->right ==NULL)
            {
                    delete(root);
                    return;
            }
            else if(root -> left != NULL && root->right == NULL){
                    root -> key = root-> left->key;
                    delete(root -> left);
                    return;
            }
            else if(root -> left == NULL && root->right !=NULL){
                    root->key = root ->right->key;
                    delete(root -> right);
                    return;
            }
            else{
                    Node* temp = root->right;
                    while(temp -> left != NULL)
                            temp = temp -> left;
                    int key = temp -> key;
                    delete(temp);
                    Delete(root,key);
                    root -> key = key;
                    return;
            }
    }

}

如果我尝试删除任何节点,则说节点50而不是删除它只是根据我收到的输出将其设为0。 删除50之前 顺序:-

20 30 40 50 60 70 80 

删除50后 顺序:-

20 30 40 0 60 70 80 
a5518382 回答:为什么此代码用于删除BST中的节点,而不是删除使其变为0

您必须删除/擦除根的右节点(因为在右子树中找到最小的根),而不是根本身。当要删除的节点同时具有两个子节点(左侧和右侧)时,将出现问题。像下面一样更改代码-

Node* temp = root->right;
while(temp -> left != NULL)
        temp = temp -> left;
int key = temp -> key;
delete(temp);
Delete(root->right,key); // modified this line
root -> key = key;

其余的一切都很好,还好! :D

本文链接:https://www.f2er.com/3105459.html

大家都在问