class Solution { public List<Integer> findMinHeightTrees(int n, int[][] edges) { if(n == 1) { return Collections.singletonList(0); } List<Set<Integer>> adjList = new ArrayList<>(); for(int i = 0; i < n; i++) { adjList.add(new HashSet<Integer>()); } for(int[] edge : edges) { adjList.get(edge[0]).add(edge[1]); adjList.get(edge[1]).add(edge[0]); } List<Integer> leaves = new ArrayList<>(); for(int i = 0; i < n; i++) { if(adjList.get(i).size() == 1) { leaves.add(i); } } int num; while(n > 2) { n -= leaves.size(); List<Integer> newLeaves = new ArrayList<>(); for(int i : leaves) { num = adjList.get(i).iterator().next(); adjList.get(num).remove(i); if(adjList.get(num).size() == 1) { newLeaves.add(num); } } leaves = newLeaves; } return leaves; } }