Νιώθω ότι δεν έχετε την ερώτηση σωστά. Θα προσπαθήσω να απαντήσω στην ερώτηση για το πώς μπορεί κανείς να σκεφτεί για την εφαρμογή της επαναληπτικής έκδοση του εν σειρά διάσχιση (εγώ απλά τυχαίνει να έχουν δώσει αυτό κάποια σκέψη και να εφαρμοστούν πολύ πρόσφατα. Αισθάνομαι ότι θα βοηθήσω τον εαυτό μου πάρα πολύ από τη θέση αυτή προς τα κάτω ), δεδομένου ότι ξέρει την αναδρομική έκδοση.
Κάθε κλήση της συνάρτησης σε μια αναδρομική έκδοση επιδιώκει να επισκεφθείτε τον κόμβο που συνδέεται με την κλήση της συνάρτησης. Η λειτουργία κωδικοποιείται έτσι ώστε η ενεργοποίηση-πλαίσιο που αντιστοιχεί σε έναν κόμβο αποθηκεύεται στη στοίβα συστήματος (περιοχή στοίβα αυτής της διαδικασίας) προτού η μπορεί να κάνει την κύρια εργασία της, δηλαδή επισκεφθούν τον κόμβο. Αυτό συμβαίνει επειδή θέλουμε να επισκεφθείτε το αριστερό υποδένδρο του κόμβου πριν από την επίσκεψη του ίδιου του κόμβου.
Μετά από το αριστερό υποδέντρο επισκέπτονται, επιστροφή στο πλαίσιο των αποθηκευμένων αποτελεσμάτων κόμβο μας στο περιβάλλον γλώσσα σκάει το ίδιο από την εσωτερική στοίβα και μια επίσκεψη στον κόμβο μας επιτρέπεται πλέον.
Πρέπει να μιμούνται αυτό πιέζει και να βρεθώ με ρητή στοίβα.
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;
}
}
}
Ο καλύτερος τρόπος για να κατανοήσουμε αυτό είναι να επιστήσει την λειτουργία της εσωτερικής στοίβας σε χαρτί για κάθε κλήση και την επιστροφή των αναδρομικών έκδοση.