我想找到一个线性时间算法,使用递归来解决实现相邻列表的有根k-tree树的直径问题。树的直径是任何一对树叶之间的最大距离。如果我选择一个根r
(即度数大于1的节点),则可以看出,直径是相同子树中两个叶子之间的最大距离,或者是一个路径的两个叶子之间的最大距离通过r
。我的这个问题的伪代码:根系k树树的直径
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之间的最大数量(函数在height[v]
和0
之间选择,因为某个子树只能有一个孩子:在这种情况下,第二大高度是0
)。我问你这个算法是否正常工作,如果没有,问题是什么?我试图推广一种解决二叉树相同问题的算法,但我不知道它是否是一种很好的泛化。
任何帮助表示赞赏!提前致谢!
什么是V(首都)?它与Adj [r]相同吗? – 2012-03-14 14:25:14
不是。 V是包含树T的所有节点的集合。 – Dree 2012-03-14 14:31:42
由于您的max_ {v in V}(...)不依赖于r,我假设您正在计算单独的而不是每个递归。 – 2012-03-14 21:04:49