Intern
/* Nejmenší společný předek v stromu s pamětí O(1) Popis Dán binární strom (ne vyhledávací): struct Node { Node* parent; Node* left; Node* right; } Je třeba napsat funkci, která pro dvě zadané vrcholy vrátí jejich nejmenší (nejbližší) společný předek: Node* Lca (Node* a, Node* b); */
sobes.tech AI
Odpověď od AI
Pro nalezení nejbližšího společného předka (LCA) v binárním stromu s ukazateli na rodiče a bez dodatečné paměti lze použít následující přístup:
- Spočítejte hloubku každého z obou vrcholů.
- Vyšší vrchol vytáhněte vzhůru po řetězci rodičů, dokud se hloubky nevyrovnají.
- Poté současně stoupejte vzhůru po řetězci rodičů obou vrcholů, dokud se nesetkají — to bude LCA.
Příklad v 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)
// Vyšší vrchol vytáhněte vzhůru
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Společně stoupejte vzhůru, dokud nenajdete společného předka
for a != b {
a = a.parent
b = b.parent
}
return a
}
Tento algoritmus používá pouze ukazatele a konstantní paměť, pracuje v čase O(h), kde h je výška stromu.