我用的拓扑排序,思路类似外星人语言那道题
public class Solution { public List<Integer> findMinHeightTrees(int n, int[][] edges) { HashMap<Integer, Integer> in_degree = new HashMap<Integer, Integer>(); HashMap<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>(); for (int i = 0; i <= n; i++) { in_degree.put(i, 0); map.put(i, new HashSet<Integer>()); } List<Integer> result = new ArrayList<Integer>(); int row = edges.length; if (row == 0) { result.add(0); return result; } int col = edges[0].length; for (int r = 0; r < row; r++) { int first = edges[r][0]; int second = edges[r][1]; in_degree.put(first, in_degree.get(first) + 1); in_degree.put(second, in_degree.get(second) + 1); map.get(first).add(second); map.get(second).add(first); } Queue<Integer> queue = new LinkedList<Integer>(); Iterator<Integer> it = in_degree.keySet().iterator(); while (it.hasNext()) { int tmp = it.next(); if (in_degree.get(tmp) == 1) { queue.offer(tmp); } } while (!queue.isEmpty()) { int size = queue.size(); List<Integer> List = new ArrayList<Integer>(); for (int i = 0; i < size; i++) { int tmp = queue.poll(); List.add(tmp); Set<Integer> set = map.get(tmp); for (int num : set) { int id = in_degree.get(num); id -= 1; in_degree.put(num, id); if (id == 1) { queue.offer(num); } } } result = List; } return result; } }