BFS + Topological Sort
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class Solution { public List<Integer> findMinHeightTrees(int n, int[][] edges) { if (n == 1) { return Collections.singletonList(0); }
int[] nodeEdges = new int[n]; List<List<Integer>> nodeMappingList = new ArrayList<>(n); for (int i = 0; i < n; i++) { nodeMappingList.add(new ArrayList<>()); } for (int[] edge : edges) { int nodeA = edge[0], nodeB = edge[1]; nodeEdges[nodeA]++; nodeEdges[nodeB]++; nodeMappingList.get(nodeA).add(nodeB); nodeMappingList.get(nodeB).add(nodeA); }
Queue<Integer> leafNodeQueue = new LinkedList<>(); for (int i = 0; i < nodeEdges.length; i++) { if (nodeEdges[i] == 1) { leafNodeQueue.offer(i); } }
List<Integer> minHeightRootList = new ArrayList<>(); while (!leafNodeQueue.isEmpty()) { minHeightRootList.clear(); for (int i = leafNodeQueue.size(); i > 0; i--) { int node = leafNodeQueue.poll(); minHeightRootList.add(node);
for (int neighbor : nodeMappingList.get(node)) { nodeEdges[neighbor]--; if (nodeEdges[neighbor] == 1) { leafNodeQueue.offer(neighbor); } } } }
return minHeightRootList; } }
|
References
310. Minimum Height Trees