Intern
/* Väikseim ühine esivanem puus O(1) mälu kasutades Kirjeldus Antud on binaarne puu (mitte otsingupuu): struct Node { Node* parent; Node* left; Node* right; } On vaja kirjutada funktsioon, mis kahe antud tipu jaoks tagastab nende väikseima (lähemalse) ühise esivanema: Node* Lca (Node* a, Node* b); */
sobes.tech AI
Vastus AI-lt
Kokkuvõtteks lähima ühise esivanema (LCA) leidmiseks binomilises puus, kus on vanemate näidikud ja ilma täiendava mäluta, saab kasutada järgmist lähenemist:
- Arvuta iga kahe tipu sügavus.
- Tõsta sügavam tipp ülespoole vanemate ahelas, kuni sügavused on võrdsed.
- Seejärel tõusege mõlema tipu vanemate ahelas koos üles, kuni nad kohtuvad — see on LCA.
Näide Go keeles:
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)
// Tõsta sügavam tipp ülespoole
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Koos ülespoole, kuni leitakse ühine esivanem
for a != b {
a = a.parent
b = b.parent
}
return a
}
See algoritm kasutab ainult näidikuid ja konstantsel mälul, töötab O(h) ajal, kus h on puu kõrgus.