class Solution { List<Integer> res = new ArrayList<Integer>(); public List<Integer> findMinHeightTrees(int n, int[][] edges) { if (n == 1) { res.add(0); return res; } List<Integer>[] graph = new List[n]; for (int i = 0; i < n; ++i) graph[i] = new ArrayList<Integer>(); //创建图 for (int[] edge : edges) { graph[edge[0]].add(edge[1]); graph[edge[1]].add(edge[0]); } int[] parent = new int[n]; Arrays.fill(parent, -1); int x = findLongestNode(graph, 0, parent); int y = findLongestNode(graph, x, parent); List<Integer> path = new ArrayList<Integer>(); parent[x] = -1; while (y != -1) { path.add(y); y = parent[y]; } if (path.size() % 2 == 0) { res.add(path.get(path.size() / 2 - 1)); res.add(path.get(path.size() / 2)); } else { res.add(path.get(path.size() / 2)); } return res; } public int findLongestNode(List<Integer>[] graph, int start, int[] parent) { int n = graph.length; boolean[] visit = new boolean[n]; Queue<Integer> queue = new LinkedList<>(); visit[start] = true; queue.offer(start); int node = -1; while(!queue.isEmpty()) { node = queue.poll(); for (int i : graph[node]) { if (visit[i] == false) { visit[i] = true; parent[i] = node; queue.offer(i); } } } return node; }}