Я пытаюсь найти алгоритм линейного времени, использующий рекурсию, для решения проблемы диаметра для корневого k-арного дерева, реализованного с помощью списков смежности.Диаметр дерева - это максимальное расстояние между любой парой листьев.Если я выберу корень r
(то есть узел, степень которого> 1), можно показать, что диаметр - это либо максимальное расстояние между двумя листьями в одном поддереве, либо максимальное расстояние между двумя листьями путикоторые проходят через r
.Мой псевдокод для этой задачи:
Tree-Diameter(T,r)
if degree[r] = 1 then
height[r] = 0
return 0
for each v in Adj[r] do
for i = 1 to degree[r] - 1 do
d_i = Tree-Diameter(T,v)
height[r] = max_{v in Adj[r]} (height[v]
return max(d_i, max_{v in V} (height[v]) + secmax_{v in V} (height[v], 0) + 1)
Чтобы получить линейное время, я вычисляю диаметр И высоту каждого поддерева одновременно.Затем я выбираю максимальное количество между диаметрами каждого поддерева и двумя самыми большими высотами дерева + 1 (функция secmax
выбирает между height[v]
и 0
, потому что у некоторого поддерева может быть только дочерний элемент: в этомВ этом случае вторая по величине высота - 0
).Я спрашиваю вас, работает ли этот алгоритм нормально, и если нет, в чем проблемы?Я попытался обобщить алгоритм, который решает ту же проблему для двоичного дерева, но я не знаю, является ли это хорошим обобщением.
Любая помощь приветствуется!Заранее спасибо!