Intern
/* Der nächste gemeinsame Vorfahre in einem Baum in O(1) Speicher Beschreibung Gegeben ist ein binärer Baum (kein Suchbaum): struct Node { Node* parent; Node* left; Node* right; } Es ist eine Funktion zu schreiben, die für zwei gegebene Knoten ihren nächsten gemeinsamen Vorfahren zurückgibt: Node* Lca (Node* a, Node* b); */
sobes.tech KI
Antwort von AI
Um den nächstgelegenen gemeinsamen Vorfahren (LCA) in einem binären Baum mit Zeigern auf die Eltern und ohne zusätzlichen Speicher zu finden, kann man den folgenden Ansatz verwenden:
- Berechne die Tiefe jeder der beiden Knoten.
- Hebe den tieferen Knoten nach oben in der Elternkette, bis die Tiefen gleich sind.
- Gehe dann gleichzeitig nach oben in der Elternkette beider Knoten, bis sie übereinstimmen — das ist der LCA.
Beispiel in Go:
type Node struct {
parent *Node
left *Node
right *Node
}
func depth(n *Node) int {
d := 0
for n != nil {
n = n.parent
d++
}
return d
}
func Lca(a, b *Node) *Node {
da := depth(a)
db := depth(b)
// Hebe den tieferen Knoten nach oben
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Gehe gemeinsam nach oben, bis sie übereinstimmen
for a != b {
a = a.parent
b = b.parent
}
return a
}
Dieser Algorithmus verwendet nur Zeiger und konstanten Speicher, läuft in O(h) Zeit, wobei h die Höhe des Baumes ist.