[英]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.