leetcode Minimum Height Trees

题目链接

这个题有点难度。。
使用的是类似拓扑排序方法。可以逐步的剔除掉树里面的叶子节点。然后,剩下树种仅有叶子节点。那么这两个就是最后的结果。

思考的方式就是。我们是从顶端到根的距离最小。那么。我们每次都去掉一层叶子,这样问题没边,还是要从根节点到叶子的最短距离。那么留下来的就可以递归执行去叶子了。

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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值