删除二进制搜索树中的元素时出错

时间:2014-04-07 06:23:25

标签: c++ data-structures tree

我只使用函数insertremovemidorder

#include<iostream>

template<class Elem>
class BinNode
{
public:
    virtual Elem& getVal() = 0;
};

template<class Elem>
class BinNodePtr:public BinNode<Elem>
{
public:
    Elem val;
    BinNodePtr* lc;
    BinNodePtr* rc;
    BinNodePtr()
    {
        lc = rc = NULL;
    }
    ~BinNodePtr()
    {
        delete lc;
        delete rc;
    }
    Elem& getVal()
    {
        return this->val;
    }
};

template<class Elem>
class BST
{
public:
    BinNodePtr<Elem> *root;
    int nodenum;
    void midorder(BinNodePtr<Elem>* start);
public:
    BST()
    {
        root = NULL;
        nodenum = 0;
    }
    bool insert(BinNodePtr<Elem>*&ptr,const Elem &e);//
    void remove(BinNodePtr<Elem>*&start,const Elem &e);//
    BinNodePtr<Elem>* getRoot(){return root;}
};

template<class Elem>
void BST<Elem>::midorder(BinNodePtr<Elem> *start)
{
    if(start == NULL) return;
    midorder(start->lc);
    printf("%d ",start->getVal());
    midorder(start->rc);
}

template<class Elem>
bool BST<Elem>::insert(BinNodePtr<Elem>*&ptr,const Elem &e)
{
    if(ptr == NULL)
    {
        ptr = new BinNodePtr<Elem>;
        ptr->lc = NULL;
        ptr->rc = NULL;
        ptr->val = e;
        return true;
    }
    else
    {
        if(ptr->val < e || ptr->val == e)
        {
            insert(ptr->rc,e);
        }
        else
        {
            insert(ptr->lc,e);
        }
    }
    return false;
}

template<class Elem>
void BST<Elem>::remove(BinNodePtr<Elem>*&start,const Elem &e)
{
    if(start == NULL)
        return ;
    if(start->val < e)
        remove(start->rc,e);
    else if(start->val > e)
        remove(start->lc,e);
    else
    {
        if(start->lc == NULL && start->rc == NULL)
        {
            delete start;
        }
        else if(start->lc == NULL)
        {
            BinNodePtr<Elem> *temp = start;
            start = start->rc;
            delete (temp);
        }
        else if(start->rc == NULL)
        {
            BinNodePtr<Elem> *temp = start;
            start = start->lc;
            delete temp;
        }
        else
        {
            BinNodePtr<Elem>* temp = start->rc;
            while(temp->lc!= NULL)
            {
                temp = temp->lc;
            }
            start->val = temp->val;
            remove(start->rc,temp->val);
        }

    }
}
int main()
{
    BST<int> myBST;
    (myBST.insert(myBST.root,10));
    (myBST.insert(myBST.root,20));
    (myBST.insert(myBST.root,5));
    (myBST.insert(myBST.root,30));
    myBST.midorder(myBST.getRoot());
    myBST.remove(myBST.root,10);
    myBST.midorder(myBST.getRoot());
    system("pause");
    return 0;
}

我已成功插入10,20,5,30,因为我可以"printf"将它们输出,但是当我使用函数remove时程序会崩溃。我调试了这个,发现函数remove有问题,但我不知道如何解决它。

0 个答案:

没有答案