https://leetcode-cn.com/problems/minimum-height-trees/
入度为1的意义:
入度为1的点基本不会作为最终答案【除了只有两个点的情况】,
因为与它相连的点(入度为1所以只有这一个点)到其他点的距离,永远比它到这些点的距离小1,以相连点为根会比入度为1的点为根最小高度更小(小于等于)。
我们刨去所有入度为1的点以后,整个图有了一个新的入度,又同样有了新的一些入度为1的点,重复上面的讨论。
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> res=new ArrayList<>();//结果集
if(n==1){
res.add(0);//第一个节点就是根节点
return res;
}
int[] degree=new int[n];//各节点的度
List<Integer>[] adj=new List[n];//各节点的关联节点列表
for(int i=0;i<n;i++){//初始化
adj[i]=new ArrayList<Integer>();
}
for(int[] edge:edges){
adj[edge[0]].add(edge[1]);
adj[edge[1]].add(edge[0]);
degree[edge[0]]++;
degree[edge[1]]++;
}
Deque<Integer> queue=new ArrayDeque<>();//度为1的节点
for(int i=0;i<n;i++){
if(degree[i]==1){
queue.add(i);
}
}
int remainNodes=n;
while(remainNodes>2){
int count=queue.size();
remainNodes-=count;
for(int i=0;i<count;i++){
int cur=queue.poll();
for(int v:adj[cur]){
degree[v]--;
if(degree[v]==1){
queue.offer(v);
}
}
}
}
while(!queue.isEmpty()){
res.add(queue.poll());
}
return res;
}
}