Dies kann besser gelöst werden. Wir können auch die Zeitkomplexität auf O (n) reduzieren, indem wir die Datenstruktur geringfügig ändern und einen iterativen Ansatz verwenden. Für eine detaillierte Analyse und mehrere Möglichkeiten zur Lösung dieses Problems mit verschiedenen Datenstrukturen.
Hier ist eine Zusammenfassung dessen, was ich in einem Blogbeitrag von mir erklären möchte :
Rekursiver Ansatz - Baumdurchmesser
Eine andere Möglichkeit, sich diesem Problem zu nähern, ist die folgende. Wie oben erwähnt kann das der Durchmesser sein
- ganz im linken unterbaum liegen oder
- ganz im rechten unterbaum liegen oder
- kann sich über die Wurzel erstrecken
Das bedeutet, dass der Durchmesser idealerweise von abgeleitet werden kann
- der Durchmesser des linken Baumes oder
- der Durchmesser des rechten Baumes oder
- die Höhe des linken Unterbaums + die Höhe des rechten Unterbaums + 1 (1, um den Wurzelknoten hinzuzufügen, wenn sich der Durchmesser über den Wurzelknoten erstreckt)
Und wir wissen, dass der Durchmesser der längste Pfad ist, also nehmen wir das Maximum von 1 und 2, falls er auf einer Seite liegt, oder wir nehmen 3, wenn er sich durch die Wurzel erstreckt.
Iterativer Ansatz - Baumdurchmesser
Wir haben einen Baum, wir brauchen eine Metainformation mit jedem Knoten, damit jeder Knoten folgendes weiß:
- Die Höhe seines linken Kindes,
- Die Höhe seines rechten Kindes und
- Der weiteste Abstand zwischen den Blattknoten.
Sobald jeder Knoten diese Informationen hat, benötigen wir eine temporäre Variable, um den maximalen Pfad zu verfolgen. Bis der Algorithmus beendet ist, haben wir den Wert des Durchmessers in der temporären Variablen.
Jetzt müssen wir dieses Problem in einem Bottom-up-Ansatz lösen, da wir keine Ahnung von den drei Werten für die Wurzel haben. Aber wir kennen diese Werte für die Blätter.
Schritte zu lösen
- Initialisiere alle Blätter mit leftHeight und rightHeight als 1.
- Initialisiere alle Blätter mit maxDistance als 0, wir machen es zu einem Punkt, dass wenn entweder leftHeight oder rightHeight 1 ist, wir maxDistance = 0 machen
- Bewegen Sie sich nacheinander nach oben und berechnen Sie die Werte für das unmittelbar übergeordnete Element. Es wäre einfach, denn jetzt kennen wir diese Werte für die Kinder.
An einem bestimmten Knoten,
- Weisen Sie leftHeight als Maximum von (leftHeight oder rightHeight des linken untergeordneten Elements) zu.
- Weisen Sie die rechte Höhe als Maximum von (leftHeight oder rightHeight des rechten untergeordneten Elements) zu.
- Wenn einer dieser Werte (leftHeight oder rightHeight) 1 ist, wird der maximale Abstand zu Null.
- Wenn beide Werte größer als Null sind, geben Sie als maxDistance leftHeight + rightHeight - 1 an
- Behalten Sie die maxDistance in einer temporären Variablen bei. Wenn die maxDistance in Schritt 4 höher ist als der aktuelle Wert der Variablen, ersetzen Sie sie durch den neuen maxDistance-Wert.
- Am Ende des Algorithmus ist der Wert in maxDistance der Durchmesser.