繁体   English   中英

BST删除c ++

[英]BST Deletion c++

我有一个用于删除BST中的节点的代码。 此代码显示某些值的内存溢出。 我不知道问题所在。 如果两个字符数组都具有相同的数据,则isequal()函数将返回true,而compare()函数将根据temp-> name和name中的值返回true或false。 如果第一个参数的值较大,则返回true。

void delete_data(char *name)
{
    bool found = false;
    tree *temp;
    tree *parent;
    temp=root;


    while(temp != NULL)
    {
        if(isequal(temp->file_name,name)==true)
        {

            found = true;
            break;
        }
        else
        {
            parent = temp;
            if(compare(name,temp->file_name)==true)
                temp=temp->right;
            else 
                temp = temp->left;
        }
    }
    if(!found)
    {
        cout<<"Data not found"<<endl;
        return;
    }

    if((temp->left==NULL&&temp->right!=NULL)||(temp->left!=NULL&&temp->right==NULL))
    {
        if(temp->left == NULL && temp->right != NULL)
        {
            if(parent->left == temp)
            {
                parent->left = temp->right;
                delete temp;
            }
            else
            {
                parent->right = temp->right;
                delete temp;
            }
        }
        else
        {
            if(parent->left == temp)
            {
                parent->left = temp->left;
                delete temp;
            }
            else
            {
                parent->right = temp->left;
                delete temp;
            }
        }
        return;
    }

    if( temp->left == NULL && temp->right == NULL)
    {
        if(parent->left == temp) parent->left = NULL;
        else parent->right = NULL;
        delete temp;
        return;
    }



    if (temp->left != NULL && temp->right != NULL)
    {
        tree *chkr; 
        if(parent==NULL || parent->left==temp)
        {  
            chkr=temp->right;
            while(chkr->left!=NULL)
                chkr=chkr->left;
            if(parent!=NULL)
                parent->left=temp->right;
            else
                root=temp->right;
            chkr->left=temp->left;
            temp->left=temp->right=NULL;
            delete temp;
        }
        else if(parent->right==temp)
        {
            chkr=temp->left;
            while(chkr->right!=NULL)
                chkr=chkr->right;
            parent->right=temp->left;
            chkr->right=temp->right;
            temp->left=temp->right=NULL;
            delete temp;
        }
        return;
    }

}

我快速浏览了一下,似乎您只在非平凡的情况下才初始化了父级。

如果根节点是要删除的节点,则父节点未初始化。 仅在temp有2个后代的情况下,才检查parent是否为非空值。 我猜这就是问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM