Abrufen einer Binary-Tree-Knoten der Tiefe nicht rekursiv
Kann jeder Punkt aus, um die Tiefe eines Knotens in einem Binären Baum (nicht ein symmetrisches, oder BST) ohne Verwendung von Rekursion? Idealerweise in Java/C/C#
Den Knoten wird dargestellt als:
class Node
{
Node Left;
Node Right;
string Value;
int Depth;
}
Mit Niveau, Um mit einer FIFO-Liste war mein Erster Gedanke, aber ich war ratlos bei der Erkennung, wenn das Niveau ändert sich, insbesondere bei unsymmetrischen Bäumen.
Rekursion ist der einfachste Weg, dies zu tun, was ist der Grund, warum Sie es vermeiden wollen?
Ist das Feld Tiefe der Abstand von der Wurzel, oder aus dem hintersten Kind?
Kirschstein: Es gibt Gründe, um zu vermeiden, rekursive Aufrufe auf Plattformen mit begrenzten Ressourcen (z.B. embedded systems). Eine nicht rekursive Algorithmus mit einem Konstanten memory foot print ist oft notwendig.
Worrier: Ah, ich sehe. Dank
Die Rekursion Beiträge, die ich gelesen habe, SO geben Sie den Rat, dass die Rekursion sollte verwendet werden, für maximal 10 Ebenen. 10 Ebenen in einem vollständigen Baum ist 1024 Elemente, also bin ich mal gespannt, wie Sie es tun würde, für mehr als das (was ich davon ausgehen, andere Bäume basierend auf den Binären Baum verwenden würde, jedoch stets symmetrisch)
Ist das Feld Tiefe der Abstand von der Wurzel, oder aus dem hintersten Kind?
Kirschstein: Es gibt Gründe, um zu vermeiden, rekursive Aufrufe auf Plattformen mit begrenzten Ressourcen (z.B. embedded systems). Eine nicht rekursive Algorithmus mit einem Konstanten memory foot print ist oft notwendig.
Worrier: Ah, ich sehe. Dank
Die Rekursion Beiträge, die ich gelesen habe, SO geben Sie den Rat, dass die Rekursion sollte verwendet werden, für maximal 10 Ebenen. 10 Ebenen in einem vollständigen Baum ist 1024 Elemente, also bin ich mal gespannt, wie Sie es tun würde, für mehr als das (was ich davon ausgehen, andere Bäume basierend auf den Binären Baum verwenden würde, jedoch stets symmetrisch)
InformationsquelleAutor Chris S | 2009-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, du meinst das ausfüllen der Wert für die Tiefe auf Knoten und/oder der Suche nach max Tiefe. Eine Möglichkeit dazu wäre die Verwendung von zwei Listen, und dabei die Ebene, um wie vorgeschlagen. Es wäre ähnlich:
Im Grunde, Sie aufzuzählen, jeder Knoten auf einer gegebenen Ebene, dann finden Sie jeden Knoten auf der nächsten Ebene, bis Sie aus dem Knoten/Ebenen. Klar, Liste ersetzt werden könnte mit gerade ungefähr jeder Liste wie Datenstrukturen (verkettete Listen, Queue, etc.). Und der Letzte Wert der 'Ebene' wäre max depth + 1. Ich vermute.
Einer weiteren Aufklärung basiert auf re-Lektüre der Frage, wenn Sie sind auf der Suche nach einem Knoten mit einem bestimmten Wert, und wollen zu finden, seine Tiefe, würden Sie die foreach-Schleife zum zählen 'wenn(Knoten.Wert==searchValue) return level;'. Und, technisch gesehen, wenn Sie sind auf der Suche nach einem bestimmten Wert, die Sie nicht tun sollten eine Level-Order-Traversal, sondern eher eine Suche nach dem Wert mit entsprechenden Binären Baum Eigenschaften (z.B. val < currentNode.Wert gehe nach Links else goto rechts), und die Verfolgung Ihrer Tiefe. Wenn Sie nur die Knoten und finden wollen, seine Tiefe, würden Sie entweder müssen zum ausführen einer binären Suche für die Knoten von der Wurzel, oder würden Sie brauchen, um zu verfolgen die Knoten parent.
InformationsquelleAutor CoderTao
Können Sie implementieren resursive Methode mit einem stack, das ist, wie resursion funktioniert sowieso. Stellen Sie sich Ihr resursive Funktion aussieht
Nicht-resursive Funktion sieht so etwas wie
EDIT:
Diese Funktion stellt die Tiefe für jeden Knoten
+1 für die Antwort. Es muss einen besseren Weg, um die Tiefe, ohne dass jedem Knoten die Tiefe, Eigentum, obwohl, Recht?
ja. Sie können ändern Sie die rekursive Funktion zu Funktion int getDepth (Knoten head, string val, int Tiefe). Pass in die Tiefe+1, um die rekursiven Aufrufe.
InformationsquelleAutor David
Hier ist eine einfachere Lösung, denke ich. Wenn die Struktur der Daten erlaubt, für eine beliebige Anzahl von Kindern, die diese Lösung kann leicht geändert werden, für diesen Fall zu:
InformationsquelleAutor user388932
Hier ist die effizienteste Lösung, die ich mir ausgedacht habe (C++). Der trick ist, verwenden Sie eine zweite Warteschlange zum speichern der Kinder aller Knoten auf der aktuellen Ebene. Dies funktioniert für symmetrische und unsymmetrische binären Bäumen.
InformationsquelleAutor hifier