leetcode310. 最小高度树(bfs)

对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。

格式

该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。

你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1][1, 0] 是相同的,因此不会同时出现在 edges 里。

示例 1:

输入: n = 4, edges = [[1, 0], [1, 2], [1, 3]]

        0
        |
        1
       / \
      2   3 

输出: [1]

代码

class Solution {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {

        Map<Integer,List<Integer>> map=new HashMap<>();
        for(int i=0;i<n;i++)
            map.put(i,new ArrayList<>());
        for (int[] edge:edges)//建立邻接表
        {
            map.get(edge[0]).add(edge[1]);
            map.get(edge[1]).add(edge[0]);
        }


        boolean[] check=new boolean[n];       
        int[] degree=new int[n];
        Queue<Integer> queue=new LinkedList<>();
        for(int i=0;i<n;i++)//记录节点的度,并且将度为1的节点入队
            if (map.get(i).size()==1) {
                queue.add(i);
                check[i]=true;
                degree[i]=1;
            }else {
                degree[i]=map.get(i).size();
                
            }


        if(queue.isEmpty()) return new ArrayList<>(){{add(0);}};//没有度为1的节点


        ArrayList<Integer> res=new ArrayList<>();
        while (!queue.isEmpty())//bfs
        {
            int size=queue.size();
            ArrayList<Integer> temp=new ArrayList<>();
            for(int i=0;i<size;i++)
            {
                int cur=queue.poll();

                for(int c:map.get(cur))//移除当前节点,将相邻节点的度减去1
                {
                    if(!check[c])
                    {
                        degree[c]--;
                        if(degree[c]<=1)//度为1则入队
                        {
                        queue.offer(c);
                        check[c]=true;
                        }

                    }
                }
                temp.add(cur);
            }
            res=temp;
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44560620/article/details/107657156