Intern
/* Դեռահասների ընդհանուր նախնին՝ O(1) հիշողությամբ Նկարագրություն Տրված է բինար ծառ (չէ որոնումային). struct Node { Node* parent; Node* left; Node* right; } Պետք է գրել ֆունկցիա, որը երկու տրված հանգույցների համար կվերադարձնի նրանց ամենափոքր (մոտակա) ընդհանուր նախնին: Node* Lca (Node* a, Node* b); */
sobes.tech AI
Պատասխան AI-ից
Երեք ուղղահայաց ծառում, որտեղ կա ծնողների ցուցանիշներ, և առանց լրացուցիչ հիշողության, կարող եք օգտագործել հետևյալ մոտեցումը՝
- Հաշվեք յուրաքանչյուր երկու կետերի խորությունը:
- Բարձրացրեք առավել խոր կետը ծնողների շղթայով մինչև որ խորությունները հավասարվեն:
- Այնուհետև, միաժամանակ բարձրացեք երկու կետերի ծնողների շղթայով մինչև հանդիպեն՝ սա կլինի 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 ծառի բարձրությունն է։