моя программа должна выполнять 5 операций: 1.insert 2.delete 3.preoder 4.inorder 5.post order using двоичное дерево поиска... моя проблема только в функции удаления. взгляните на этот код:
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, появится следующее окно: "программа не отвечает", что я должен сделать, чтобы решить эту проблему? Я имею в виду, как мне удалить корень?
Я добавил этот фрагмент кода, чтобы проверить, является ли нужный узел корнем или нет:
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;
}
}
}
но все же окно: программа не отвечает...
Одна из проблем, возникающих при удалении корня, заключается в том, что родительский элемент остается NULL, а затем вы разыгрываете его.
while
это?