Во-первых,
искать высоту первого элемента.
Кроме того, верните путь к нему, используя связанный список.
Вы можете сделать это за O (logN) время. Предположим, дерево сбалансировано, где высота logN.
пусть H1 = высота первого элемента.
Тогда,
ищите высоту ко второму элементу.
Кроме того, верните путь к нему, используя связанный список.
Вы можете сделать это за O (logN) время.
Пусть H2 = высота второго элемента.
Трассировка по обоим связанным спискам, собранным до тех пор, пока значения больше не будут равны (пути расходятся)
Точку, прежде чем они расходятся, назовите высоту этого узла H3.
Таким образом, самый длинный путь
H1 + H2 - 2 * H3 (поскольку вам нужно H1, чтобы перейти к H1, и H2, чтобы перейти к H2. Но на самом деле,
Вы можете проследить от H1 до H1-H3. а затем перейти к H2 от H3.
Так что это (H1-H3) + (H2-H3) = H1 + H2 -2 * H3.
Детали реализации должны быть простыми
search(Tree* Head, Node* Value, LinkedList path, int distance);
Таким образом,
search(Head, Value1, path1, height1);
search(Head, Value2, path2, height2);
i = 0;
while (path1[i] == path2[i])
{
i++;
}
height3 = i-1;
return height1+height2- 2*height3;
Сложность времени: O (logN) + O (logN) + O (logN) = O (logN)
Сложность пространства: O (logN) (для хранения обоих связанных списков расстояний)