Weird fout in binaire zoekboom

stemmen
-3
#include <iostream>
using namespace std;
#define YES 1
#define NO 0

class tree
{
    private:

    public:
        struct leaf
        {
            int data;
            leaf *l;
            leaf *r;
        };
        struct leaf *p;
        tree();
        ~tree();
        void destruct(leaf *q);
        tree(tree& a);
        void add(int n);
        void transverse();
        void in(leaf *q);
        void pre(leaf *q);
        void post(leaf *q);
        leaf*  createBST(int *preOrder, int* inOrder, int len);     
};      
tree::tree()
{
    p=NULL;
}
tree::~tree()
{
    destruct(p);
}
void tree::destruct(leaf *q)
{

}

void tree::transverse()
{
    int c;
    cout<<\n1.InOrder\n2.Preorder\n3.Postorder\nChoice: ;
    cin>>c;
    switch(c)
    {
        case 1:
            in(p);
            break;

        case 2:
            pre(p);
            break;

        case 3:
            post(p);
            break;
    }
}
void tree::in(leaf *q)
{
    if(q!=NULL)
    {
        in(q->l);
        cout<<\t<<q->data<<endl;
        in(q->r);
    }

}
void tree::pre(leaf *q)
{
    if(q!=NULL)
    {
        cout<<\t<<q->data<<endl;
        pre(q->l);
        pre(q->r);
    }

}
void tree::post(leaf *q)
{
    if(q!=NULL)
    {
        post(q->l);
        post(q->r);
        cout<<\t<<q->data<<endl;
    }

}



tree::leaf* tree::createBST(int *preOrder, int* inOrder, int len)
{
    int i;
    tree::leaf *bst = new tree::leaf;
//  tree bst;
//  if(len < 0)
//      {//bst = NULL;
//      return bst;}

    bst->data = *preOrder;
    for(i = 0; i < len; i++)
        if(*(inOrder + i) == *preOrder)
        break;
    if(i>=0)    
        bst->l = createBST(preOrder + 1, inOrder, i);
    if((len-i-1) >=0)
        bst->r = createBST(preOrder + i +1, inOrder + i + 1, len-i-1);
    return bst;

}

int main()
{


    tree bst;
    int pre_data[] = {20,8,4,12,10,14,22};
    int in_data[] = {4,8,10,12,14,20,22};
    bst.p = bst.createBST(pre_data, in_data, 7);
    bst.transverse();

    return 0;
}

Het belangrijkste probleem in functie

  tree::leaf* tree::createBST(int *preOrder, int* inOrder, int len)

Let op: Ik heb twee vragen over dit geplaatst. Omdat ik mijn code aangepast veel ik begonnen met een nieuwe functie.

De vraag is gesteld op 20/03/2011 om 23:47
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Ik denk dat de fout is dat je geen terminating voorwaarde voor uw recursie. Beschouw het geval waar len == 0, u deze regel code wordt uitgevoerd:

bst->l = createBST(preOrder + 1, inOrder, i);

Dit zal passeren in een lengte hebben van 0 en hetzelfde zal weer gebeuren. Dit is oneindige herhaling, en zal een segmentation fault veroorzaken.

Ik denk dat uw probleem wordt opgelost door het toevoegen van deze naar het begin van createBST:

if(len == 0)
    return NULL;
antwoordde op 21/03/2011 om 00:06
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more