Я знаю, что подобные вопросы были заданы раньше, но я думаю, что мое решение намного проще. Особенно по сравнению с Wikipedia.Есть ли лучший способ найти самого низкого общего предка?
Просьба доказать, что я ошибаюсь!
Если у вас есть дерево с узлами, которые имеют заданную структуру данных:
struct node
{
node * left;
node * right;
node * parent;
int key;
}
Вы могли бы написать такую функцию:
node* LCA(node* m, node* n)
{
// determine which of the nodes is the leftmost
node* left = null;
node* right = null;
if (m->key < n->key)
{
left = m;
right = n;
}
else
{
left = n;
right = m;
}
// start at the leftmost of the two nodes,
// keep moving up the tree until the parent is greater than the right key
while (left->parent && left->parent->key < right->key)
{
left = left->parent;
}
return left;
}
Этот код является довольно простым и худший случай O (n), средний случай - это, вероятно, O (logn), особенно если дерево сбалансировано (где n - количество узлов в дереве).
Спасибо за объяснение! – theninjagreg