我的程序应该做5个操作:1.insert 2.delete 3.preoder 4.inorder 5.post order使用二叉搜索树......我的问题只在于删除功能。看看这段代码:
void tree::del()
{
if(isempty())
{
cout<<"Tree is Empty"<<endl;
return;
}
int num;
bool flag=false;
cout<<"enter the number that u want to delete"<<endl;
cin>>num;
node *curr=root;
node *parent=NULL;
while(curr)
{
if(curr->info == num)
{
flag=true;
break;
}
else if(curr->info > num)
{
parent=curr;
curr=curr->left;
}
else if (curr->info < num)
{
parent=curr;
curr=curr->right;
}
}
if(flag==false)
{
cout<<"The number was not found"<<endl;
return;// end of function or method
}
/// curr in leaf
cout<<"The number was found"<<endl;
if(curr->left==NULL && curr->right==NULL) // if the enterend number was a leaf
{
if(parent->left==curr)
{
cout<<curr->info<<" was deleted\n";
parent->left=NULL;
}
else
{
cout<<curr->info<<" was deleted\n";
parent->right=NULL;
}
delete curr;
return;
}
if((curr->right==NULL && curr->left!=NULL) ||(curr->left==NULL && curr->right!=NULL))//if curr had 1 child
{
if (curr->right==NULL && curr->left!=NULL)
{
if(parent->left==curr)
{
parent->left=curr->left;
}
else
{
parent->right=curr->left;
}
}
else
{
if(parent->right==curr)
{
parent->right=curr->right;
}
else
{
parent->left=curr->right;
}
}
delete curr;
return;
}
if(curr->left !=NULL && curr->right !=NULL) //if curr had 2 children
{
node *temp=curr->right;
if(parent->left==curr)
{
if(temp->right==NULL)
{
parent->left=curr->right;
temp->left=curr->left;
}
else
{
while(temp->left!=NULL)
temp=temp->left;
parent->left=curr->right;
temp->left=curr->left;
}
}
else if(parent->right==curr)
{
if(temp->right==NULL)
{
parent->right=curr->right;
temp->left=curr->left;
}
else
{
while(temp->left!=NULL)
temp=temp->left;
parent->right=curr->right;
temp->left=curr->left;
}
}
}
delete curr;
return;
}
我的删除功能正常,唯一的问题是当我要删除root时!当我选择删除根时,会出现以下窗口:“程序没有响应” 我该怎么做才能解决这个问题?我的意思是我该如何删除根?
我添加了这段代码来检查所需节点是否为root:
if(parent==curr)
{
if(curr->left==NULL && curr->right==NULL)
{
root=NULL;
delete curr;
}
else if ((curr->right==NULL && curr->left!=NULL) ||(curr->left==NULL && curr->right!=NULL))
{
if((curr->right==NULL && curr->left!=NULL))
{
root=curr->left;
delete curr;
}
else
{
root=curr->right;
delete curr;
}
}
else if(curr->left !=NULL && curr->right !=NULL)
{
root=parent->left;
if(root->left==NULL)
root->left=parent->right;
else
{
curr=root;
while(curr)
curr=curr->left;
curr->left=parent->right;
}
}
}
但仍然是窗口:程序没有响应出现......
答案 0 :(得分:0)
删除root时遇到的一个问题是父级仍为NULL,然后取消引用它。