Leetcode 310. Minimum Height Trees

来源:互联网 发布:js提示return非法 编辑:程序博客网 时间:2024/04/30 15:33

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;}}


0 0
原创粉丝点击