Intern
/* Ağacda O(1) yaddaşla ən kiçik ümumi ata Təsviri Verilən ikili ağac (axtarış deyil): struct Node { Node* parent; Node* left; Node* right; } İki verilmiş düyün üçün onların ən kiçik (ən yaxın) ümumi atasını qaytaran funksiya yazmalısınız: Node* Lca (Node* a, Node* b); */
sobes.tech Süni İntellekt
AI-dan cavab
İki ulduzun ən yaxın ümumi atasını (LCA) ata göstəriciləri olan və əlavə yaddaş olmadan tapmaq üçün aşağıdakı yanaşmadan istifadə edə bilərsiniz:
- Hər iki ulduzun dərinliyini hesablayın.
- Daha dərin ulduzu ata göstəriciləri boyunca yuxarı qaldırın, dərinliklər bərabər olana qədər.
- Sonra, hər iki ulduzun ata göstəriciləri boyunca birlikdə yuxarı qalxın, onlar uyğunlaşana qədər — bu, LCA olacaq.
Go dilində nümunə:
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)
// Daha dərin ulduğu yuxarı qaldırın
for da > db {
a = a.parent
da--
}
for db > da {
b = b.parent
db--
}
// Birlikdə yuxarı qalxın, ümumi ata tapana qədər
for a != b {
a = a.parent
b = b.parent
}
return a
}
Bu alqoritm yalnız göstəricilər və sabit yaddaş istifadə edir, O(h) vaxtda işləyir, burada h ağacın hündürlüyüdür.