这个题有点难度。。
使用的是类似拓扑排序方法。可以逐步的剔除掉树里面的叶子节点。然后,剩下树种仅有叶子节点。那么这两个就是最后的结果。
思考的方式就是。我们是从顶端到根的距离最小。那么。我们每次都去掉一层叶子,这样问题没边,还是要从根节点到叶子的最短距离。那么留下来的就可以递归执行去叶子了。
public class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if(n==1)
{
List<Integer> li=new LinkedList();
li.add(0);
return li;
}
ArrayList<Set<Integer>> graph=new ArrayList<>(n);
for(int i=0;i<n;i++)
{
graph.add(new HashSet<Integer>());
}
for(int[] arr:edges)
{
Set<Integer> eSet=null;
eSet=graph.get(arr[0]);
if(eSet==null)
{
eSet=new HashSet<Integer>();
graph.set(arr[0], eSet);
}
eSet.add(arr[1]);
eSet=graph.get(arr[1]);
if(eSet==null)
{
eSet=new HashSet<Integer>();
graph.set(arr[1], eSet);
}
eSet.add(arr[0]);
}
LinkedList<Integer> leafs=new LinkedList<>();
for(int i=0;i<graph.size();i++)
{
if(graph.get(i).size()==1)
{
leafs.add(i);
}
}
while(true)
{
LinkedList<Integer> newleafs=new LinkedList<>();
for(Integer i:leafs)
{
Set<Integer> set=graph.get(i);
for (Integer integer : set) {
Set<Integer> set2= graph.get(integer);
set2.remove(i);
if(set2.size()==1)
{
newleafs.add(integer);
}
}
}
if(newleafs.size()==0)
{
return leafs;
}
leafs=newleafs;
}
}
}