Leetcode310. 最小高度树–基于拓扑排序求解此问题
思想:由边界向中心逐渐收缩,直至收缩到最里层。
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
//采用基于拓扑排序算法,一步步排除不可能解,最后只剩下可能解
List<Integer> ret=new ArrayList<Integer>();
if(n==1) {
ret.add(0);
return ret;
}
ArrayList<Integer>[] Adj=new ArrayList[n];
for(int i=0;i<n;i++){
Adj[i]=new ArrayList<Integer>();
}
int[] inDegree=new int[n];
for(int i=0;i<n-1;i++) {
int x=edges[i][0];
int y=edges[i][1];
Adj[x].add(y);
Adj[y].add(x);
inDegree[x]++; inDegree[y]++;
}
Queue<Integer> queue=new LinkedList<Integer>();
int[] visited=new int[n];
for(int i=0;i<n;i++) {
if(inDegree[i]==1) {
queue.add(i);
visited[i]=1;
}
}
while(!queue.isEmpty()) {
int size=queue.size();
ret.clear();
while(size>0) {
size--;
int curNode=queue.poll();
ret.add(curNode);
for(Integer next:Adj[curNode]) {
inDegree[next]--;
if(inDegree[next]==1 && visited[next]==0) {
visited[next]=1;
queue.offer(next);
}
}
}
}
return ret;
}
}