iterative Postorder Traverse bst?

stimmen
-1

Ich habe zwei Fragen, 1) für jeden rekursiven Algorithmus gibt einen iterativen Algorithmus existiert, ist das richtig? Ich denke , es ist richtig, denn man muss nur den Stack verwenden explicit.And es wird in dieser Frage bestätigt Way von Rekursion gehen zu Iteration

2) wahrscheinlich die gleiche Frage wie die oben genannten, Ich glaube nicht, dass wirklich die iterative Lösung ist offensichtlich, oder einfach zu schreiben, auch mit dem rekursiven Algorithmus. Zum Beispiel: für eine Postorder (LRN) oder Inorder (LNR) bst Traverse, wie könnte man es mit iterativen Verfahren schreiben? In diesen beiden Fällen ist es nicht einfach, das erste Objekt zu finden in den Stapel einzufügen. Das ist, wo ich stecken geblieben.

Irgendwelche Vorschläge? Eigentlich mein Ziel die gleiche wie die obige Frage ist, versuchen, ein allgemeines Muster zu finden rekursiven Algorithmus zu iterativ denjenigen zu ändern.

Veröffentlicht am 24/05/2011 um 08:45
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Ich fühle mich nicht die Frage richtig gefragt. Ich werde versuchen, die Frage zu beantworten, wie man über die Umsetzung der iterative Version in Ordnung Traversal denken kann (ich gerade diese einige Gedanken gegeben haben, passieren und umgesetzt es vor kurzem. Ich fühle ich mich auch, indem Sie diesen nach unten helfen ) gegeben, dass man die rekursive Version kennt.

Jeder Funktionsaufruf in einer rekursiven Version sucht den Knoten mit dem Funktionsaufruf zugeordnet zu besuchen. Die Funktion ist so codiert, dass die Aktivierung-Rahmens zu einem Knoten entspricht, wird auf den Systemstapel (Stack-Bereich dieses Prozesses) gespeichert, bevor der es seine Hauptaufgabe machen kann, dh den Knoten besuchen. Dies ist so, weil wir den linken Teilbaum des Knotens vor dem Besuch der Knoten selbst besuchen wollen.

Nachdem der linke Unterbaum besucht wird, ist eine Rückkehr in den Rahmen unserer gespeicherten Knoten Ergebnisse in der Sprachumgebung das gleiche aus dem internen Stack und einen Besuch in unseren Knoten knallt jetzt erlaubt.

Wir haben diese Schiebe- und knallen mit einem expliziten Stapel zu imitieren.

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;
        }
    }
}

Der beste Weg, dies zu verstehen, ist es, das Funktionieren des Binnen Stapels auf dem Papier bei jedem Aufruf und Rückkehr der rekursiven Version zu zeichnen.

Beantwortet am 24/05/2011 um 15:31
quelle vom benutzer

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