BST删除c ++

时间:2013-12-08 10:51:31

标签: c++

我有一个删除BST中节点的代码。此代码显示某些值的内存溢出。我无法弄清楚这个问题。如果两个char数组具有相同的数据,则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;
    }

}

1 个答案:

答案 0 :(得分:0)

我快速浏览了一下,看起来你只是在非平凡的情况下初始化父。

如果root是您要删除的节点,则父级未初始化。只有在temp有2个后代的情况下,才检查父项是否为非null。我猜这就是问题所在。