【发布时间】:2012-03-30 16:46:02
【问题描述】:
我试图找到一种使用递归的线性时间算法来解决使用邻接列表实现的有根 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)。我问你这个算法是否工作正常,如果没有,有什么问题?我试图泛化一个算法来解决二叉树的相同问题,但我不知道它是否是一个很好的泛化。
感谢任何帮助!提前致谢!
【问题讨论】:
-
什么是 V(大写)?和 Adj[r] 一样吗?
-
不。 V 是包含树 T 的所有节点的集合。
-
由于你的 max_{v in V} (...) 不依赖于 r,我假设你是单独计算而不是每次递归。
-
问题只是高度,我不知道如何递归检查:|