class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if (n == 1) {
return Arrays.asList(n - 1);
}
Map<Integer, Set<Integer>> neighbors = new HashMap<>();
for (int[] edge : edges) {
Set<Integer> nei = neighbors.get(edge[0]);
if (nei == null) nei = new HashSet<>();
nei.add(edge[1]);
neighbors.put(edge[0], nei);
nei = neighbors.get(edge[1]);
if (nei == null) nei = new HashSet<>();
nei.add(edge[0]);
neighbors.put(edge[1], nei);
}
Queue<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
if (neighbors.get(i).size() == 1) queue.offer(i);
}
while (n > 2) {
//仍然需要逐层遍历,在每一层结束之后检查n还剩多少
int size = queue.size();
for (int s = 0; s < size; s++) {
int leaf = queue.poll();
Set<Integer> neis = neighbors.get(leaf);
for (int nei : neis) {
neighbors.get(nei).remove(leaf);
if (neighbors.get(nei).size() == 1) queue.offer(nei);
}
n--;
}
}
List<Integer> ans = new ArrayList<>();
while (!queue.isEmpty()) {
ans.add(queue.poll());
}
return ans;
}
}