Intern
/* Най-малкият общ прародител в дървото с O(1) памет Описание Дадено е бинарно дърво (не търсещо): struct Node { Node* parent; Node* left; Node* right; } Трябва да напишете функция, която за две дадени върхове ще връща техния най-малък (най-близък) общ прародител: Node* Lca (Node* a, Node* b); */
sobes.tech AI
Отговор от AI
За да намерите най-близкия общ предшественик (LCA) в двоично дърво с указатели към родителите и без допълнителна памет, можете да използвате следния подход:
- Изчислете дълбочината на всеки от двата върха.
- Вдигнете по-високия връх нагоре по веригата на родителите, докато дълбочините не се изравнят.
- След това, едновременно се изкачвайте нагоре по веригите на родителите на двата върха, докато не се срещнат — това ще бъде LCA.
Пример на 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)
// Вдигнете по-високия връх
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Заедно се изкачвайте нагоре, докато не намерите общ предшественик
for a != b {
a = a.parent
b = b.parent
}
return a
}
Този алгоритъм използва само указатели и константна памет, работи за време O(h), където h е височината на дървото.