Intern
/* Mazākais kopīgais senelis kokā ar O(1) atmiņu Apraksts Dota binārais koks (ne meklēšanas): struct Node { Node* parent; Node* left; Node* right; } Ir jāuzraksta funkcija, kas diviem dotajiem mezgliem atgriež viņu mazāko (tuvāko) kopīgo seneli: Node* Lca (Node* a, Node* b); */
sobes.tech AI
Atbilde no AI
Lai atrastu tuvāko kopīgo senču (LCA) binārajā kokā ar vecāku norādītājiem un bez papildu atmiņas, var izmantot sekojošo pieeju:
- Aprēķiniet katra no diviem mezgliem dziļumu.
- Paceliet dziļāko mezglu augšup pa vecāku ķēdi, līdz dziļumi sakrīt.
- Tad vienlaikus kāpiet augšup pa abu mezglu vecāku ķēdēm, līdz tie saskaras — tas būs LCA.
Piemērs Go valodā:
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)
// Pacel dziļāko mezglu
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Kāpiet kopā, līdz saskarsieties
for a != b {
a = a.parent
b = b.parent
}
return a
}
Šis algoritms izmanto tikai norādes un konstantu atmiņu, tas darbojas laikā O(h), kur h ir koka augstums.