Leetcode 310. Minimum Height Trees
这个解法思路很巧妙:
从最简单地开始:如果是一个list,从两端采用双指针的方法,当两个指针相遇或间隔为1时返回。
如果是一个树的话,则从度为1的节点(不一定是叶子节点),度为一只需要统计边数就可以了,多个指针向前遍历(宽度优先搜索),直到只剩一个或两个节点,便为所求。
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if(n==1) return Collections.singletonList(0);
List<Set<Integer>> graph = new ArrayList<Set<Integer>>();
for(int i=0;i<n;i++) graph.add(new HashSet<Integer>());
for(int[] edge:edges){
graph.get(edge[0]).add(edge[1]);
graph.get(edge[1]).add(edge[0]);
}
List<Integer> leaves = new ArrayList<Integer>();
for(int i=0;i<n;i++){
if(graph.get(i).size()==1) leaves.add(i);
}
while(n>2){
n-=leaves.size();
List<Integer> newleaves = new ArrayList<Integer>();
for(int i :leaves){
int j = graph.get(i).iterator().next();
graph.get(j).remove(i);
if(graph.get(j).size()==1) newleaves.add(j);
}
leaves = newleaves;
}
return leaves;
}
}