树的直径——后序遍历(java)
树的直径
http://www.nowcoder.com/questionTerminal/a77b4f3d84bf4a7891519ffee9376df3
import java.util.*; public class Solution { class Node{ // 邻接点结构 int id, dist; //id表示节点编号,dist表示距离 public Node(){} public Node(int id, int dist){ this.id = id; this.dist = dist; } } int maxv = 0; List<Node>[] g; // 保存邻接点 public int solve (int n, Interval[] Tree_edge, int[] Edge_value) { g = new List[n]; for (int i = 0; i < n; ++i){ g[i] = new LinkedList<>(); } for (int i = 0; i < n - 1; ++i){ int x = Tree_edge[i].start, y = Tree_edge[i].end; g[x].add(new Node(y, Edge_value[i])); g[y].add(new Node(x, Edge_value[i])); } dfs(0, -1); return maxv; } public int dfs(int root, int parent){ List<Integer> list = new LinkedList<>(); for (Node v : g[root]){ if (v.id == parent) continue; list.add(dfs(v.id, root) + v.dist); } Collections.sort(list); int n = list.size(), val = 0; for (int i = n - 1; i >= 0 && i >= n - 2; --i){ val += list.get(i); } maxv = Math.max(maxv, val); return n == 0 ? 0 : list.get(n - 1); } }