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 баландии дарахт аст.