Wie finde ich den niedrigsten gemeinsamen Vorfahren zweier Knoten in einem Binärbaum?

Der Binärbaum hier muss nicht unbedingt ein binärer Suchbaum sein.
Die Struktur könnte wie folgt verstanden werden:

struct node {
    int data;
    struct node *left;
    struct node *right;
};

Die maximale Lösung, die ich mit einem Freund ausarbeiten konnte, war etwas in dieser Art -
Erwägendieser binäre Baum :

Binärer Baum http://lcm.csa.iisc.ernet.in/dsa/img151.gif

Die Inorder Traversal Ausbeuten - 8, 4, 9, 2, 5, 1, 6, 3, 7

Und der Nachbestellungsdurchlauf ergibt - 8, 9, 4, 5, 2, 6, 7, 3, 1

Wenn wir zum Beispiel den gemeinsamen Vorfahren der Knoten 8 und 5 finden wollen, dann erstellen wir eine Liste aller Knoten, die im Inorder Tree Traversal zwischen 8 und 5 liegen, was in diesem Fall zufällig [4, 9 ist 2]. Dann prüfen wir, welcher Knoten in dieser Liste zuletzt in der Nachbestellungsüberquerung erscheint, nämlich 2. Daher ist der gemeinsame Vorfahr für 8 und 5 2.

Ich glaube, die Komplexität für diesen Algorithmus ist O (n) (O (n) für Inorder- / Postorder-Traversen, der Rest der Schritte ist wiederum O (n), da es sich nur um einfache Iterationen in Arrays handelt.) Es besteht jedoch eine große Wahrscheinlichkeit, dass dies falsch ist. :-)

Aber dies ist eine sehr grobe Herangehensweise, und ich bin nicht sicher, ob sie für einen bestimmten Fall zusammenbricht. Gibt es eine andere (möglicherweise optimalere) Lösung für dieses Problem?

Antworten auf die Frage(30)

Ihre Antwort auf die Frage