itérative postorder traverse bst?

voix
-1

J'ai deux questions, 1) pour tout algorithme récursif, il existe un algorithme itératif, est - ce pas? Je pense que ce qui est juste, parce que vous suffit d'utiliser la pile explicit.And il est confirmé dans cette question Way pour aller de récursivité à l' itération

2) probablement la même question comme celle-ci, je ne pense vraiment la solution itérative est évidente ou facile d'écrire même avec l'algorithme récursif. Par exemple: pour un postorder (LRN) ou afinde (LNR) traverse bst, comment pourriez-vous écrire avec méthode itérative? Dans ces deux cas, il est difficile de trouver le premier objet à insérer dans la pile. C'est là que je me suis coincé.

Aucune suggestion? En fait, mon but est le même que la question ci-dessus, essayez de trouver un modèle général pour changer l'algorithme récursif pour les itératives.

Créé 24/05/2011 à 08:45
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

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.

Créé 24/05/2011 à 15:31
source utilisateur

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