algorithm - first - java tree postorder traversal



K├╝rzester Wurzel-zu-Blatt-Pfad (3)

Was ist der einfachste Weg, vorzugsweise unter Verwendung von Rekursion, um den kürzesten Wurzel-zu-Blatt-Pfad in einem BST (Binärsuchbaum) zu finden. Java bevorzugte, Pseudocode in Ordnung.

Vielen Dank!

https://ffff65535.com


Das ist in C ++, aber es ist so einfach, dass Sie es leicht konvertieren können. Ändern Sie einfach min zu max, um die maximale Baumtiefe zu erhalten.

int TreeDepth(Node* p)
{
    return (p == NULL) ? 0 : min(TreeDepth(p->LeftChild), TreeDepth(p->RightChild)) + 1;
}

Nur um zu erklären, was dies tut, zählt es vom Blattknoten (es gibt 0 zurück, wenn es ein Blatt findet) und zählt zurück zur Wurzel. Wenn Sie dies für die linke und rechte Seite des Baums tun und das Minimum nehmen, erhalten Sie den kürzesten Weg.


Die Breitensuche ist in Bezug auf die Anzahl der besuchten Eckpunkte genau optimal. Sie müssen jede der Eckpunkte, die Sie besuchen würden, in einer breiten ersten Suche besuchen, nur um zu beweisen, dass Sie das nächste Blatt haben!

Wenn Sie Rekursion verwenden, ist Mike Thompsons Ansatz jedoch fast der richtige - und etwas einfacher.

TD(p) is
  0 if p is NULL (empty tree special case)
  1 if p is a leaf (p->left == NULL and p->right == NULL)
  min(TD(p->left), TD(p->right)) if p is not a leaf 

Allgemeine Beschreibung:

Verwenden Sie eine Breitensuche (BFS) im Gegensatz zu einer Tiefensuche (DFS) . Finde den ersten Knoten ohne Kinder.

Mit einem DFS können Sie auf einigen Eingabebäumen Glück haben (aber es gibt keine Möglichkeit zu wissen, dass Sie Glück hatten, also müssen Sie immer noch den ganzen Baum durchsuchen), aber die BFS-Methode ist viel schneller und Sie können eine Lösung finden, ohne alle zu berühren. Knoten.

Um den Pfad "root to leaf" zu finden, können Sie dem ersten gefundenen, kinderlosen Knoten bis zum Stamm folgen, indem Sie die übergeordnete Referenz verwenden. Wenn Sie keine übergeordnete Referenz in jedem Knoten gespeichert haben, können Sie die übergeordneten Knoten nachverfolgen, während Sie sich zurückverfolgen. Wenn Sie Ihre Liste in umgekehrter Reihenfolge haben, können Sie alles auf einen Stapel schieben und dann herausnehmen.

Pseudocode:

Das Problem ist sehr einfach; Hier ist Pseudo-Code, um die kleinste Länge zu finden:

  1. Setzen Sie den Root-Knoten in die Warteschlange ein.

Wiederholen Sie diesen Vorgang, solange die Warteschlange nicht leer ist und kein Ergebnis gefunden wurde:

  1. Ziehen Sie einen Knoten vom Anfang der Warteschlange und prüfen Sie, ob er keine Kinder hat. Wenn es keine Kinder hat, sind Sie fertig und haben den kürzesten Weg gefunden.
  2. Andernfalls schieben Sie alle Kinder (links, rechts) in die Warteschlange.

Alle kürzesten Pfade finden:

Um alle kürzesten Pfade zu finden, können Sie die Tiefe des Knotens zusammen mit dem Knoten in der Warteschlange speichern. Dann würden Sie den Algorithmus für alle Knoten in der Warteschlange mit der gleichen Tiefe fortsetzen.

Alternative:

Wenn Sie sich stattdessen für ein DFS entschieden haben, müssen Sie den gesamten Baum durchsuchen, um den kürzesten Pfad zu finden. Dies könnte jedoch optimiert werden, indem ein Wert für das kürzeste bis jetzt gehalten wird und nur die Tiefe zukünftiger Knoten überprüft wird, bis Sie einen neuen kürzesten finden oder bis Sie den kürzesten bis jetzt erreicht haben. Das BFS ist jedoch eine viel bessere Lösung.





breadth-first-search