Im vorherigen Artikel sagte ich, der rekursive Traversal -Kalenderalgorithmus (Binärbaum erster Wurzel (erster Sequenz) durchzuführen.
Fassen Sie den nicht rezisiven Algorithmus der ersten Durchquerung zusammen.
1) Geben Sie den Stapel ein, hauptsächlich, um den Stapel -ersten Knoten einzugeben, und besuchen Sie dann diesen Knoten
2) während
3) Das richtige Kind des If -Knotens ist wahr, übertragen Sie auf 1) weiter nach Überqueren, andernfalls wird der aktuelle Knoten beendet und auf den übergeordneten Knoten übertragen 1)
Schauen Sie sich zunächst den Algorithmus an, der dieser Idee entspricht:
Kopieren Sie den Code -Code wie folgt:
Int vorOrderTraversenonRcursiveex (const bitree & t, int (*VisitNode) (TeleMype -Daten))
{{{{
if (t == null)
{{{{
Return -1;
}
Bitnode *pBinode = t;
Sqstack S;
Initstack (& s);
Push (& s, (selectyp) t);
While (! IsStackedy (s))
{{{{
Während (PBINODE)
{{{{
VisitNode (pBinode-> data);
if (pBinode! = t)
{{{{
Push (& s, (selectyp) pBinode;
}
pBinode = pBinode-> lchild;
}
if (pBinode == null)
{{{{
Pop (& s, (selemtype*) & pBinode);
}
if (pBinode-> rchild == null)
{{{{
Pop (& s, (selemtype*) & pBinode);
}
PBINODE = PBINODE-> RCHILD;
}
Rückkehr 0;
}
Hinweis: 1) Die Stapelstruktur wird hier verwendet, und Sie können den Stapel in der obigen Reihenfolge der oben genannten Struktur sehen
2) Wenn ich den Knoten speichere, speichere ich die Adresse des Zeigers, dh die Adresse des Knotens und verwandelt ihn in einen Int -Speicher. . Warum denken Sie über die Verwendung von Zeigern selbst?
Der obige Algorithmus ist eigentlich falsch! Warum? Hier überprüfte ich lange Zeit. Denn wenn der Stapel nach dem POP leer ist, aber immer noch den richtigen Baumbaum, wird er nicht zu viel überprüft. Wenn der linke Kinderbaum leer ist, wie folgt: wie folgt:
Kopieren Sie den Code -Code wie folgt:
Int vorOrderTraversenonRcursive (const bitree & t, int (*VisitNode) (Telemtype -Daten)))
{{{{
if (t == null)
{{{{
Return -1;
}
Bitnode *pBinode = t;
Sqstack S;
Initstack (& s);
Push (& s, (selectyp) t);
While (! IsStackedy (s))
{{{{
Gettop (s, (selectype*) & pBinode);
Während (PBINODE)
{{{{
VisitNode (pBinode-> data);
pBinode = pBinode-> lchild;
Push (& s, (selectyp) pBinode;
}
if (pBinode == null)
{{{{
Pop (& s, (selemtype*) & pBinode);
}
if (! isStackedy (s))
{{{{
Pop (& s, (selemtype*) & pBinode);
PBINODE = PBINODE-> RCHILD;
Push (& s, (selectyp) pBinode;
}
}
Rückkehr 0;
}
Dies ist der Fall. Drücken Sie es in den rechten Kinderknoten und bestimmen Sie dann, ob das linke Kind des rechten Baumes leer ist, und setzen Sie den Zyklus fort.
Hier gibt es zwei Abfälle: Einer besteht darin, in die Knoten des leeren Kindes zu drücken, um in den Stapel zu gelangen, und der andere besteht
Kehren Sie hier zurück, um den Algorithmus zuerst zu sehen, wobei der Nullknoten nicht in den Nullzeiger oder das leere Kind gedrückt wird, aber hier kann er nicht vollständig ausgegeben werden. Null ist Null, so dass es keine Verlegenheit gibt, die den Knoten des rechten Sub -Tree -Baums nicht wie folgt anzeigt: wie folgt:
Kopieren Sie den Code -Code wie folgt:
// nicht rezidiv durchqueren Binärbaum
Int vorOrderTraversenonrcursivex (const bitree & t,
Int (*VisitNode) (Telemtype -Daten))
{{{{
if (t == null)
{{{{
Return -1;
}
Bitnode *pBinode = t;
Sqstack S;
Initstack (& s);
Push (& s, (selectyp) t);
While (! IsStackedy (s) || pBinode) // Die Hauptänderung ist dieser Satz
{{{{
Während (PBINODE)
{{{{
VisitNode (pBinode-> data);
if (pBinode! = t)
{{{{
Push (& s, (selectyp) pBinode;
}
pBinode = pBinode-> lchild;
}
if (pBinode == null)
{{{{
Pop (& s, (selemtype*) & pBinode);
}
if (pBinode-> rchild == null)
{{{{
Pop (& s, (selemtype*) & pBinode);
}
PBINODE = PBINODE-> RCHILD;
}
Rückkehr 0;
}
Nach der ersten, während die Schleife hinzugefügt wird, reicht sie aus. Testen Sie wie folgt den binären Baum im vorherigen Abschnitt:
Zu diesem Zeitpunkt sind die Eingabedaten immer noch 12 34 0 0 78 0 0. Die Testergebnisse sind wie folgt:
--- Bitree ---
Bitte geben Sie Bitree -Knotendaten ein:
12
Bitte geben Sie Bitree -Knotendaten ein:
34
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
78
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
0
12 34 78
Dies reicht nicht aus, um zu testen. Schauen Sie sich den folgenden binären Baum an
Zu diesem Zeitpunkt sollten die Eingabedaten: 12 34 24 0 0 0 0 0 78 37 0 0 0 0 0 sein. Die Testergebnisse sind wie folgt:
--- Bitree ---
Bitte geben Sie Bitree -Knotendaten ein:
12
Bitte geben Sie Bitree -Knotendaten ein:
34
Bitte geben Sie Bitree -Knotendaten ein:
vierundzwanzig
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
50
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
78
Bitte geben Sie Bitree -Knotendaten ein:
37
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
0
Bitte geben Sie Bitree -Knotendaten ein:
0
12 34 24 50 78 37
Aus dem vorläufigen Traversal ist es zu erkennen, dass diese Algorithmen nicht nur vom Vorwort durchlaufen werden. und fügen Sie es dann hinzu, um sich daran zu beitreten.