如何删除BST中的根?

时间:2013-12-27 11:28:07

标签: c++ binary-search-tree

我的程序应该做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;
                }
            }
        }

但仍然是窗口:程序没有响应出现......

1 个答案:

答案 0 :(得分:0)

删除root时遇到的一个问题是父级仍为NULL,然后取消引用它。