我有一个删除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;
}
}
答案 0 :(得分:0)
我快速浏览了一下,看起来你只是在非平凡的情况下初始化父。
如果root是您要删除的节点,则父级未初始化。只有在temp有2个后代的情况下,才检查父项是否为非null。我猜这就是问题所在。