Leaf trimming
Time O(n) Space O(n)Degrees; queue all leaves (degree 1). While more than 2 nodes remain, remove the current leaves and collect neighbours whose degree drops to 1 as the next layer.
import java.util.*;
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if (n == 1) return List.of(0);
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
int[] deg = new int[n];
for (int[] e : edges) { adj.get(e[0]).add(e[1]); adj.get(e[1]).add(e[0]); deg[e[0]]++; deg[e[1]]++; }
List<Integer> leaves = new ArrayList<>();
for (int i = 0; i < n; i++) if (deg[i] == 1) leaves.add(i);
int remaining = n;
while (remaining > 2) {
remaining -= leaves.size();
List<Integer> next = new ArrayList<>();
for (int leaf : leaves)
for (int v : adj.get(leaf)) if (--deg[v] == 1) next.add(v);
leaves = next;
}
return leaves;
}
}Verdict: Linear; BFS from every node would be O(n²).