class Solution {
List<Integer> res = new ArrayList<Integer>();
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if (n == 1) {
res.add(0);
return res;
}
List<Integer>[] graph = new List[n];
for (int i = 0; i < n; ++i) graph[i] = new ArrayList<Integer>();
//创建图
for (int[] edge : edges) {
graph[edge[0]].add(edge[1]);
graph[edge[1]].add(edge[0]);
}
int[] parent = new int[n];
Arrays.fill(parent, -1);
int x = findLongestNode(graph, 0, parent);
int y = findLongestNode(graph, x, parent);
List<Integer> path = new ArrayList<Integer>();
parent[x] = -1;
while (y != -1) {
path.add(y);
y = parent[y];
}
if (path.size() % 2 == 0) {
res.add(path.get(path.size() / 2 - 1));
res.add(path.get(path.size() / 2));
} else {
res.add(path.get(path.size() / 2));
}
return res;
}
public int findLongestNode(List<Integer>[] graph, int start, int[] parent) {
int n = graph.length;
boolean[] visit = new boolean[n];
Queue<Integer> queue = new LinkedList<>();
visit[start] = true;
queue.offer(start);
int node = -1;
while(!queue.isEmpty()) {
node = queue.poll();
for (int i : graph[node]) {
if (visit[i] == false) {
visit[i] = true;
parent[i] = node;
queue.offer(i);
}
}
}
return node;
}
}