310 Minimum Height Trees
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
Map<Integer, Set<Integer>> hash = new HashMap<>();
for (int i = 0; i < n; i++) hash.put(i, new HashSet<>());
for (int[] edge : edges){
hash.get(edge[0]).add(edge[1]);
hash.get(edge[1]).add(edge[0]);
}
Queue<Integer> q = new LinkedList<>();
for (int key : hash.keySet()){
if (hash.get(key).size() == 1) q.offer(key);
}
while (n > 2){
int size = q.size();
for (int i = 0; i < size; i++){
int cur = q.poll();
n--;
for (int nei : hash.get(cur)){
hash.get(nei).remove(cur);
if (hash.get(nei).size() == 1) q.offer(nei);
}
}
}
List<Integer> ans = new ArrayList<>();
if (q.isEmpty()) ans.add(0);
while (!q.isEmpty()){
ans.add(q.poll());
}
return ans;
}
}