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.