class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if(n == 1){
List<Integer> answer = new ArrayList<>();
answer.add(0);
return answer;
}
List<List<Integer>> graph = new ArrayList<>();
for(int i = 0 ; i < n ; i++) graph.add(new ArrayList<>());
int[] degrees = new int[n];
for(int[] edge : edges){
int u = edge[0];
int v = edge[1];
graph.get(u).add(v);
graph.get(v).add(u);
//무방향 그래프이기 때문에 간선을 두 개 연결해줌
degrees[u]++;
degrees[v]++;
//간선의 개수 = 차수
}
Queue<Integer> queue = new LinkedList<>();
for(int i = 0 ; i < n ; i++){
if(degrees[i] == 1) queue.offer(i);
//간선이 하나 == 리프노드
}
while(n > 2){
int size = queue.size();
n -= size;
for(int i = 0 ; i < size ; i++){
int cur = queue.poll();
for(int next : graph.get(cur)){
degrees[next]--;
//차수 감소
if(degrees[next]==1) queue.offer(next);
}
}
}
List<Integer> answer = new ArrayList<>(queue);
return answer;
}
}
모든 간선들의 가중치를 오름차순으로 정렬하여 순회하면서 신장 트리에 삽입하나 사이클이 생성되지 않도록 반복적으로 연결하는 탐욕적 Greedy 알고리즘