Intern
/* Mažiausias bendras protėvis medyje naudojant O(1) atmintį Aprašymas Duotas binarinis medis (ne paieškos): struct Node { Node* parent; Node* left; Node* right; } Reikia parašyti funkciją, kuri dviem duotiems mazgams grąžins jų mažiausią (artimiausią) bendrą protėvį: Node* Lca (Node* a, Node* b); */
sobes.tech AI
Atsakymas iš AI
Norint rasti artimiausią bendrą protėvį (LCA) dvejetainėje medyje su tėvų nuorodomis ir be papildomos atminties, galima naudoti šį požiūrį:
- Apskaičiuokite kiekvieno iš dviejų viršūnių gylį.
- Pakelkite giliau esantį viršūnę aukštyn tėvų grandine, kol gyliai taps lygūs.
- Tada, vienu metu kylant aukštyn abiejų viršūnių tėvų grandinėmis, kol jos susitiks — tai bus LCA.
Pavyzdys Go kalba:
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)
// Pakelkite giliau esantį viršūnę
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Kylant kartu aukštyn, kol susitiks — tai bus LCA
for a != b {
a = a.parent
b = b.parent
}
return a
}
Šis algoritmas naudoja tik nuorodas ir pastovią atmintį, veikia O(h) laiku, kur h yra medžio aukštis.