Πώς λειτουργεί ένα ένθετο είδος για το έργο σειρά BST;

ψήφοι
1

Έχω προσπαθήσει να το κάνει recursively..The μητρικής ακέραιο varaible θα είναι όπως εγώ, σύμφωνα με τον τύπο, 2*i +1για leftChild«s και 2*i +2για το δικαίωμα.

void BST::insert(const data &aData)
{
    if ( items[Parent].empty ) 
    {
        items[Parent].theData = aData;
        items[Parent].empty = false;
    }
    else if ( aData < items[Parent].theData )
    {
        Parent = 2 * Parent + 1;
        if ( Parent >= maxSize ) this->reallocate();
        this->insert(aData);
    }
    else
    {
        Parent = (2 * rightChild++)+ 2;
        if ( Parent >= maxSize ) this->reallocate();
        this->insert(aData);
    }
}

Λειτουργεί μια χαρά όταν τοποθετείτε αντικείμενα που είναι μικρότερη από την αρχική μητρική ... Αλλά όταν βρίσκω κάτι που είναι μεγαλύτερο αυτό όλες οι βίδες μέχρι: x

void BST::reallocate()
{
    item *new_array = new item[maxSize*2];

    for ( int array_index = 0; array_index < maxSize; array_index++ ) 
    {
        if ( ! items[array_index].empty )
        {
            new_array[array_index].theData = items[array_index].theData;
        }
    }
    maxSize *= 2;
    delete [] items;

    items = NULL;
    items = new_array;
}

Εδώ είναι ctor μου, έτσι κανείς δεν παίρνει πια σύγχυση τότε είμαι:

BST::BST(int capacity) : items(new item[capacity]), size(0), Parent(0),
leftChild(0), rightChild(0)
{
    items->empty = true;
    maxSize = capacity;
}
private:
    int size;  // size of the ever growing/expanding tree :)
    int Parent;
    int maxSize;    
    int leftChild;
    int rightChild;
    struct item
    {
        bool empty;
        data theData;
    };
    item *items;    // The tree array

Η λειτουργία εισαγωγής παραπάνω είναι πραγματικά το καλύτερο που μπορώ να πάρω ..

                                 R
                                / \
                               /   \
                              /     \
                             L       X
                            / \     / \
                           J   V   K   T   <--The only out of place node.
                          / \   \
                         / NULL  \
                        G        /
                                P

Κατά την εισαγωγή: R, L, J, G, X, K, V, P, Tμε αυτή τη σειρά

Δημοσιεύθηκε 18/11/2009 στις 01:44
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Θα ήθελα να υποψιάζεστε ότι το πρόβλημά σας είναι σε αυτή τη γραμμή:

    Parent = (2 * rightChild++)+ 2;

Γιατί χρησιμοποιείτε rightChild εδώ αντί (2 * Parent) + 2;

Για να κάνει τα πράγματα πιο σαφή, μπορεί να θέλετε να προσθέσετε μερικές απλές λειτουργίες ενσωματωμένες στην τάξη σας για τον υπολογισμό των δεικτών των αριστερά / δεξιά παιδιών και της μητρικής, δίνεται ένα ευρετήριο:

inline int getLeftChildIndex(int nodeNdx) { return (nodeNdx * 2) + 1; }
inline int getRightChildIndex(int nodeNdx) { ... }
inline int getParentIndex(int nodeNdx) { ... }

Μπορεί επίσης να θέλετε να εξετάσει τη χρήση των κατηγοριών search()ή find()μέθοδο (υποθέτω ότι έχει ένα) για να προσδιοριστεί πού να εισάγετε ένα νέο κόμβο. Η λειτουργία αναζήτησης θα πρέπει είτε να παραδώσει τον δείκτη ενός υπάρχοντος κόμβου (είναι στο χέρι σας να αποφασίσετε πώς να χειριστεί την εισαγωγή των διπλών τιμών) ή ο δείκτης για το πού θα πρέπει να εισαχθεί η νέα τιμή.

Απαντήθηκε 24/11/2009 στις 01:08
πηγή χρήστη

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