Druck-Blatt-Knoten in einen binären Baum von rechts nach Links?
Ich bin auf der Suche nach einer Antwort für diese:
Finden Sie den pseudo-code für das ausdrucken der Blatt-Knoten in einen binären Baum, von
von rechts nach Links.
Ich würde mich freuen zu hören, einige Ideen. Ein Tip (nicht eine vollständige Lösung, natürlich), oder einen link zu einem verwandten Thema, das hilft mir für das Verständnis dieses Problems wäre hilfreich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Führen Sie eine Tiefe-ersten traversal des Baums, den Umgang mit den rechten sub-Bäume erste und drucken nur die Blattknoten.
Der einfachste Weg, um dies zu implementieren, ist mit einer rekursiven Funktion.
Diese Seite ist sehr hilfreich für die Visualisierung der Lösung: Baum Traversal.
Können Sie so etwas tun(code in C++).
Die Idee hinter diesem code ist, tun inorder traversal - /postorder traversal & prüfen, ob die Links & rechts Kinder NULL sind oder nicht. Wenn es Null es bedeutet, es ist ein Blattknoten.
Würden Sie brauchen, um eine rekursive Methode, beginnen, wobei die Methode der top-level-Knoten eines binären Baums.
In der pseudocode, gehe ich davon aus, dass jeder Knoten ist definiert mit "rechts" und "Links" - Mitglieder, die selbst Knoten und eine Eigenschaft "name", um etwas zu drucken über den Knoten. Die Methode könnte wie folgt Aussehen, in keiner Sprache, da Sie sagte pseudocode:
Dann Sie würde beginnen mit:
Oder
Eigentlich beim erstellen der Liste in Schritt one halten Sie das hinzufügen von Knoten auf dem Kopf lassen und zeigen, zum vorherigen Knoten(anstatt vorherigen Knoten zeigt auf neuen Knoten).
Drucken Blatt-Knoten, während Sie die level-order-Traversierung in umgekehrter Reihenfolge mit Ausnahme der Knoten, die nicht Blatt.
Tun Inoder/Preorder/postorder, Sondern für das Recht, Kind, Zuerst, Dann gehe zum linken Kind
Vermutlich wissen Sie das traversieren eines binären Baums, um mit Rekursion.
Werden Sie feststellen, dass, wenn Sie dies tun, Sie sind bereits mit der Handhabung der Blätter in Links-nach-rechts Reihenfolge, in der neben der Verarbeitung von nicht-Blatt-Knoten.
Besuchen von rechts nach Links, nur in umgekehrter Reihenfolge der Anweisungen -- so besuchen Sie die rechts, dann Bearbeiten Sie den Wert, dann besuchen Sie die Links.
Drucken nur Blattknoten, Sie müssen nur eine
if
- Anweisung umhandleValue
, sagt er zu nur ausgegeben, wenn der Knoten ein Blatt ist. Ein Knoten ist ein Blatt, wenn es weder einen linken noch rechten Kind-Knoten.ist es die Rekursion , es geht immer rechts, bis es ist kein Recht
dann endlich Recht es zurück zu den Stamm drucken, dann drucken Links
also eigentlich, aus der Sie drucken größten Wert auf die niedrigste
dann wieder zurück und so ist die gleiche Sache
dann wieder zurück und so ist die gleiche Sache
dann wieder zurück und so ist die gleiche Sache
bla...blaa..blaa
Ich weiß, dass ich bin, er ein Alter thread, aber ich denke, es kann helfen, andere Leser dieses Threads. Wenn Sie sprechen über die interview-Frage, denke ich, dass die rekursive Antwort ist nur ein kleiner Teil der Antworten, und der interviewer zu hören, wie der iterative Ansatz. Der rechts in Links-traversal (Druck) ist keine reguläre Prä - /post - /inorder traversalen, die beschrieben ist im wiki. Der main Idee ist hier, dass Sie brauchen, um Recht zu gehen, so lange wie Sie können und starten Sie den Druck aus der rechten Knotens zuerst, dann seine Eltern und erst dann den linken Teilbaum.
Rekursiv:
Iterativ:
Node.visited
-- warum hat derStack
version?Node
, und ohne den Algorithmus ändernNode
s, wie es geht. Eine option ist, um einen Stapel vonObject
, entweder mit einemString
oder eineNode
auf dem stack, und entscheiden, was zu tun ist basierend aufinstanceof
. Ein weiteres ist das erstellen einerTask
- Klasse, und verwenden SieStack<Task>
.