как удалить рут в BST?

0

моя программа должна выполнять 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;
                }
            }
        }

но все же окно: программа не отвечает...

  • 0
    Это означает, что у вас, вероятно, есть бесконечный цикл. Уход использовать оператор печати и выяснить , какие в while это?
  • 0
    так что я должен сделать, чтобы решить это?
Показать ещё 1 комментарий
Теги:
binary-search-tree

1 ответ

0
Лучший ответ

Одна из проблем, возникающих при удалении корня, заключается в том, что родительский элемент остается NULL, а затем вы разыгрываете его.

  • 0
    tnx из-за твоего ответа я нашел свою проблему ;-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню