επαναληπτική postorder τραβέρσα BST;

ψήφοι
-1

Έχω δύο ερωτήσεις, 1) για κάθε αναδρομικό αλγόριθμο, υπάρχει ένα επαναληπτικό αλγόριθμο, είναι σωστό αυτό; Νομίζω ότι είναι σωστό, γιατί απλά πρέπει να χρησιμοποιήσετε τη στοίβα explicit.And επιβεβαιώνεται σε αυτό το ερώτημα τρόπος για να πάει από την αναδρομή στην επανάληψη

2) πιθανώς το ίδιο θέμα όπως η παραπάνω, εγώ πραγματικά δεν σκέφτομαι το επαναληπτική λύση είναι προφανής ή εύκολο να γράψει ακόμα και με το αναδρομικό αλγόριθμο. Για παράδειγμα: για ένα postorder (LRN) ή inorder (LNR) BST τραβέρσα, πώς θα μπορούσατε να το γράψετε με την επαναληπτική μέθοδο; Σε αυτές τις δύο περιπτώσεις, δεν είναι εύκολο να βρείτε το πρώτο αντικείμενο να τοποθετήσετε μέσα στο σωρό. Αυτός είναι όπου πήρα κολλήσει.

Οποιεσδήποτε προτάσεις? Στην πραγματικότητα, ο σκοπός μου είναι η ίδια με την παραπάνω ερώτηση, προσπαθήστε να βρείτε ένα γενικό σχέδιο για την αλλαγή αναδρομικό αλγόριθμο για την επαναληπτική αυτά.

Δημοσιεύθηκε 24/05/2011 στις 08:45
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Νιώθω ότι δεν έχετε την ερώτηση σωστά. Θα προσπαθήσω να απαντήσω στην ερώτηση για το πώς μπορεί κανείς να σκεφτεί για την εφαρμογή της επαναληπτικής έκδοση του εν σειρά διάσχιση (εγώ απλά τυχαίνει να έχουν δώσει αυτό κάποια σκέψη και να εφαρμοστούν πολύ πρόσφατα. Αισθάνομαι ότι θα βοηθήσω τον εαυτό μου πάρα πολύ από τη θέση αυτή προς τα κάτω ), δεδομένου ότι ξέρει την αναδρομική έκδοση.

Κάθε κλήση της συνάρτησης σε μια αναδρομική έκδοση επιδιώκει να επισκεφθείτε τον κόμβο που συνδέεται με την κλήση της συνάρτησης. Η λειτουργία κωδικοποιείται έτσι ώστε η ενεργοποίηση-πλαίσιο που αντιστοιχεί σε έναν κόμβο αποθηκεύεται στη στοίβα συστήματος (περιοχή στοίβα αυτής της διαδικασίας) προτού η μπορεί να κάνει την κύρια εργασία της, δηλαδή επισκεφθούν τον κόμβο. Αυτό συμβαίνει επειδή θέλουμε να επισκεφθείτε το αριστερό υποδένδρο του κόμβου πριν από την επίσκεψη του ίδιου του κόμβου.

Μετά από το αριστερό υποδέντρο επισκέπτονται, επιστροφή στο πλαίσιο των αποθηκευμένων αποτελεσμάτων κόμβο μας στο περιβάλλον γλώσσα σκάει το ίδιο από την εσωτερική στοίβα και μια επίσκεψη στον κόμβο μας επιτρέπεται πλέον.

Πρέπει να μιμούνται αυτό πιέζει και να βρεθώ με ρητή στοίβα.

template<class T>
void inorder(node<T> *root)
{
    // The stack stores the parent nodes who have to be traversed after their
    // left sub-tree has been traversed
    stack<node<T>*> s;

    // points to the currently processing node
    node<T>* cur = root;

    // Stack-not-empty implies that trees represented by nodes in the stack
    // have their right sub-tree un-traversed
    // cur-not-null implies that the tree represented by 'cur' has its root
    //   node and left sub-tree un-traversed
    while (cur != NULL || !s.empty())
    {
        if (cur != NULL)
        {
            for (; cur->l != NULL; cur = cur->l) // traverse to the leftmost child because every other left child will have a left subtree
                s.push(cur);
            visit(cur); // visit him. At this point the left subtree and the parent is visited
            cur = cur->r; // set course to visit the right sub-tree
        }
        else
        {// the right sub-tree is empty. cur was set in the last iteration to the right subtree
            node<T> *parent = s.top();
            s.pop();
            visit(parent);
            cur = parent->r;
        }
    }
}

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

Απαντήθηκε 24/05/2011 στις 15:31
πηγή χρήστη

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