题目:
题解:
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> ans = new ArrayList<Integer>();
if (n == 1) {
ans.add(0);
return ans;
}
int[] degree = new int[n];
List<Integer>[] adj = new List[n];
for (int i = 0; i < n; i++) {
adj[i] = new ArrayList<Integer>();
}
for (int[] edge : edges) {
adj[edge[0]].add(edge[1]);
adj[edge[1]].add(edge[0]);
degree[edge[0]]++;
degree[edge[1]]++;
}
Queue<Integer> queue = new ArrayDeque<Integer>();
for (int i = 0; i < n; i++) {
if (degree[i] == 1) {
queue.offer(i);
}
}
int remainNodes = n;
while (remainNodes > 2) {
int sz = queue.size();
remainNodes -= sz;
for (int i = 0; i < sz; i++) {
int curr = queue.poll();
for (int v : adj[curr]) {
degree[v]--;
if (degree[v] == 1) {
queue.offer(v);
}
}
}
}
while (!queue.isEmpty()) {
ans.add(queue.poll());
}
return ans;
}
}