310. Minimum Height Trees
Solution
從leaf(degree == 1的node) 開始,每次前進一格,直到沒尋訪到的node數目剩下一個or兩個。

implementation重點:
用Set[]紀錄所有node連結的點
用set[i].size去知道degree狀態
透過BFS來尋訪node
當尋訪node時,要記得把跟node有連結的點的(connected set)更新,避免重複查找
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if(n == 1){
List list = new LinkedList<Integer>();
list.add(0);
return list;
}
Set<Integer>[] graph = new HashSet[n];
Set<Integer> set = new HashSet<>();
for(int i = 0; i < n; i++){
graph[i] = new HashSet<Integer>();
set.add(i);
}
for(int[] edge : edges){
graph[edge[0]].add(edge[1]);
graph[edge[1]].add(edge[0]);
}
Queue<Integer> queue = new LinkedList<>();
//First run nodes
for(int i = 0; i < n; i++){
if(graph[i].size() == 1){
queue.add(i);
}
}
//BFS
while(!queue.isEmpty()){
if(set.size() <= 2){
break;
}
int size = queue.size();
for(int i = 0; i < size; i++){
int element = queue.poll();
set.remove(element);
for(int con : graph[element]){
graph[con].remove(element);
if(graph[con].size() == 1){
queue.add(con);
}
}
}
}
return new LinkedList<Integer>(set);
}
Last updated
Was this helpful?