关于广度优先搜索的一些领悟

也不算是领悟吧,就是一些感想,树的BFS很简单,应该轻车熟路了,就是把节点放在队列中,每次都把他的子节点再放进去,无脑遍历就行了,因为树相当于是有向的图,所以不用标记每个点是否被遍历过,因为每个点肯定都只遍历一次,但是今天遇到了图的BFS,说实话,图一直都没有复习,所以对于这种问题,思路还是没那么清晰的,下面列出此题:

我们首先看这是树的应用,但是慢慢会发现,我们就是一层一层的找,把尽可能多的点都放在一层,最后那一层肯定就是符合要求的,所以我们模拟一下邻接表和出度和入度(这题是无向,题中有显示,变为度),每次把度为1的都加入队列,进行BFS就行啦,剩下最后一层,用链表进行承接,顺便说一下,jdk1.8Hashmap是数组,链表,红黑树,链表长度大于8那么变为红黑树,红黑树数量少于6,那么变为链表,负载因子是0.75.。好啦复习完啦,列出代码:

public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer> ans = new ArrayList<>();
        if (n == 1) {
            ans.add(0);
            return ans;
        }
        int[] degree = new int[n];
        List<List<Integer>> map = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            map.add(new ArrayList<>());
        }
        for (int[] edge : edges) {
            degree[edge[0]]++;
            degree[edge[1]]++;
            map.get(edge[0]).add(edge[1]);
            map.get(edge[1]).add(edge[0]);
        }
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (degree[i] == 1) {
                queue.offer(i);
            }
        }
        while (!queue.isEmpty()) {
            ans = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int cur = queue.poll();
                ans.add(cur);
                List<Integer> nexts = map.get(cur);
                for (Integer next : nexts) {
                    degree[next]--;
                    if (degree[next] == 1) {
                        queue.offer(next);
                    }
                }
            }
        }
        return ans;
    }

睡觉咯

发布了17 篇原创文章 · 获赞 0 · 访问量 148

猜你喜欢

转载自blog.csdn.net/qq_33286699/article/details/105189580
今日推荐