it-swarm.com.de

Höhe eines binären Baumes

Betrachten Sie den folgenden Code:

public int heightOfBinaryTree(Node node)
{
    if (node == null)
    {
        return 0;
    }
    else
    {
        return 1 +
        Math.max(heightOfBinaryTree(node.left),
            heightOfBinaryTree(node.right));
    }
}

Ich möchte die logischen Gründe für diesen Code kennen. Wie sind die Leute darauf gekommen? Haben manche einen induktiven Beweis?

Außerdem habe ich mir überlegt, einfach ein BFS mit der Wurzel des Binärbaums als Argument zu erstellen, um die Höhe des Binärbaums zu ermitteln. Ist der vorherige Ansatz besser als meiner und warum?

36
Programmer
if (node == null)
{
    return 0;
}

Die Kinder von Blattknoten sind null. Deshalb heißt das, wenn wir erst einmal an den Blättern vorbeigegangen sind, gibt es keine weiteren Knoten.

Wenn wir nicht hinter den Blattknoten sind, müssen wir die Höhe berechnen und dieser Code tut dies rekursiv.

return 1 +

Der aktuelle Knoten fügt der Höhe des aktuell berechneten Teilbaums eine Höhe von 1 hinzu.

    Math.max(heightOfBinaryTree(node.left),
        heightOfBinaryTree(node.right));

Wir berechnen rekursiv die Höhe des linken Teilbaums (node.left) Und des rechten Teilbaums (node.right). Da wir die maximale Tiefe berechnen, nehmen wir das Maximum dieser beiden Tiefen.

Ich habe oben gezeigt, dass die rekursive Funktion korrekt ist. Wenn Sie also die Funktion auf dem übergeordneten Knoten aufrufen, wird die Tiefe des gesamten Baums berechnet.

Hier ist eine grafische Darstellung der Höhe eines Baumes von dieses Dokument . h ist die Höhe des Baums, hl und hr sind die Höhen der linken und rechten Teilbäume.

Außerdem habe ich mir überlegt, einfach ein BFS mit der Wurzel des Binärbaums als Argument zu erstellen, um die Höhe des Binärbaums zu ermitteln. Ist der vorherige Ansatz besser als meiner und warum?

Der von Ihnen angegebene Code ist eine Form von DFS. Da Sie alle Knoten verarbeiten müssen, um die Höhe des Baums zu ermitteln, gibt es keinen Laufzeitunterschied zwischen DFS und BFS, obwohl BFS O(N) Speicher verwendet, während DFS O(logN) Speicher. BFS ist auch etwas komplexer im Code, da es eine Warteschlange erfordert, während DFS den "eingebauten" rekursiven Stapel verwendet.

48
marcog

Die Logik hinter diesem Code lautet:

da ein Knoten zwei Kinder hat, ist die Höhe des Baums maximal die Höhe des Baums, dessen Wurzeln das linke und das rechte Kind sind, und natürlich +1 für den Weg zu den Kindern.

Wie Sie sehen können, ist die obige Beschreibung rekursiv, ebenso wie der Code.

BFS sollte es auch tun, aber es wäre ein Overkill sowohl für die Implementierung als auch für die Komplexität von Raum und Zeit.

Es gibt einige rekursive Funktionen, die zwar schwer zu verstehen sind, aber sehr elegant zu implementieren sind.

4
Shamim Hafiz

Die Höhe eines Baumes ist die Länge des längsten Abwärtspfades von seiner Wurzel. Diese Funktion ist eine rekursive Methode, um die Ebenen eines Binärbaums zu zählen. Es erhöht nur die Zähler, wenn es den Baum herunterfährt, und gibt den maximalen Zähler zurück (den Zähler auf dem untersten Knoten).

Ich hoffe ich habe geholfen.

2
tiagovrtr

Es ist eine rekursive Funktion. Es heißt, die Höhe eines Baumes ist 1 + die Höhe seines höchsten Astes.

Ist BFS eine breite erste Suche? Ich bin mir nicht sicher, welchen Unterschied es in der Effizienz geben würde, aber ich mag die Einfachheit der rekursiven Funktion.

0
Adrian Mouat