Περίεργο σφάλμα σε δυαδικό δένδρο αναζήτησης

ψήφοι
-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;
}

Το κύριο πρόβλημα είναι σε λειτουργία

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

Σημείωση: Έχω δημοσιεύσει δύο ερωτήσεις σχετικά με αυτό. Επειδή έχω τροποποιημένο κωδικό μου πολλά άρχισα μια νέα θέση.

Δημοσιεύθηκε 20/03/2011 στις 23:47
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
2

Πιστεύω ότι το λάθος είναι ότι δεν έχετε καμία προϋπόθεση τερματισμού για αναδρομή σας. Σκεφτείτε την περίπτωση len == 0, θα εκτελέσει αυτή τη γραμμή κώδικα:

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

Αυτό θα περάσει σε μήκος 0 και το ίδιο θα συμβεί και πάλι. Αυτό είναι άπειρη αναδρομή, και θα προκαλέσει ένα σφάλμα κατάτμησης.

Νομίζω ότι το πρόβλημα έχει λυθεί με την προσθήκη αυτή στην αρχή της createBST:

if(len == 0)
    return NULL;
Απαντήθηκε 21/03/2011 στις 00:06
πηγή χρήστη

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