Je pense que vous ne l'avez pas posé la question correctement. Je vais essayer de répondre à la question de savoir comment on peut penser à la mise en œuvre de la version itérative dans l'ordre traversal (je viens d'arriver à avoir donné cette réflexion et mis en œuvre très récemment. Je sens que je vais me aider aussi en mettant cette baisse ) étant donné que l'on connaît la version récursive.
Chaque appel de fonction dans une version récursive cherche à visiter le noeud associé à l'appel de fonction. La fonction est codée de telle sorte que cadre de l'activation correspondant à un noeud est sauvegardé dans la pile du système (zone de pile de ce processus) avant l'on peut faire son travail principal, soit chez le noeud. Il en est ainsi parce que nous voulons visiter le sous-arbre gauche du noeud avant de visiter le nœud lui-même.
Après le sous-arbre gauche est visité, un retour au cadre de nos résultats de nœuds enregistrés dans l'environnement linguistique popping même de la pile interne et une visite à notre noeud est maintenant autorisé.
Nous devons imiter ce pousser et sauter avec une pile explicite.
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;
}
}
}
La meilleure façon de comprendre est de tirer le bon fonctionnement de la pile interne sur papier à chaque appel et le retour de la version récursive.