https://leetcode.com/problems/minimum-height-trees/?tab=Description
找到图转为树之后的最低深度时的根节点
根节点一定是图的最长路径的中间节点
不停删除最外层的叶子节点,直到剩下节点小于等于两个就是所求
public class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if (n == 1) {
return Collections.singletonList(0);
}
List<HashSet<Integer>> all = new ArrayList(n);
for (int i = 0; i < n; i++) {
all.add(new HashSet<Integer>());
}
for (int[] edge : edges) {
int i1 = edge[0];
int i2 = edge[1];
all.get(i1).add(i2);
all.get(i2).add(i1);
}
List<Integer> leaves = new ArrayList();
for (int i = 0; i < all.size(); i++) {
if (all.get(i).size() == 1) {
leaves.add(i);
}
}
while (n > 2) {
n -= leaves.size();
List<Integer> newLeaves = new ArrayList();
for (int i = 0; i < leaves.size(); i++) {
int j = all.get(leaves.get(i)).iterator().next();
all.get(j).remove(leaves.get(i));
if (all.get(j).size() == 1) {
newLeaves.add(j);
}
}
leaves = newLeaves;
}
return leaves;
}
}