栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

算法练习——宽度优先搜索算法 BFS

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法练习——宽度优先搜索算法 BFS

宽度优先搜索算法 BFS 主要应用:二叉树搜索或者图搜索 主要思想:层层递进,一层一层遍历 和DFS(深度优先)差别: DFS侧重“分支” BFS侧重“层” 基本实现思想: (1)顶点v入队列。 (2)当队列非空时则继续执行,否则算法结束。 (3)出队列取得队头顶点v; (4)查找顶点v的所以子节点,并依次进入队列; (5)转到步骤(2)。 力扣 102. 二叉树的层序遍历

用一个二元组 来表示状态

它表示某个节点(node)和它所在的层数(level)

每个新进队列的节点的层数都是父亲节点的层数加一

最后根据每个点的层数对点进行分类

分类的时候我们可以利用哈希表

维护一个以层数为键,对应节点值组成的数组为值

广度优先搜索结束以后按层数从小到大取出所有值返回即可

class Solution {
    public List> levelOrder(TreeNode root) {
        List> ret = new ArrayList>();
        if (root == null) {
            return ret;
        }
        Queue queue = new linkedList();
        queue.offer(root);
        while (!queue.isEmpty()) {
            List level = new ArrayList();
            int currentLevelSize = queue.size();
            for (int i = 1; i <= currentLevelSize; ++i) {
                TreeNode node = queue.poll();
                level.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            ret.add(level);
        }     
        return ret;
    }
}

力扣二叉树的层序遍历 II

在遍历完一层节点之后,将存储该层节点值的列表添加到结果列表的尾部

我们需要返回的 List 是一个接口,可以使用链表实现

class Solution {
    public List> levelOrderBottom(TreeNode root) {
        List> levelOrder = new linkedList>();
        if (root == null) {
            return levelOrder;
        }
        Queue queue = new linkedList();
        queue.offer(root);
        while (!queue.isEmpty()) {
            List level = new ArrayList();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                level.add(node.val);
                TreeNode left = node.left, right = node.right;
                if (left != null) {
                    queue.offer(left);
                }
                if (right != null) {
                    queue.offer(right);
                }
            }
            levelOrder.add(0, level);
        }
        return levelOrder;
    }
}
力扣200. 岛屿数量

难度中等1456收藏分享切换为英文接收动态反馈

如果一个位置为 1,则将其加入队列

每个搜索到的 1 都会被重新标记为 0

直到队列为空,搜索结束

岛屿的数量就是我们进行广度优先搜索的次数

class Solution {
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }

        int nr = grid.length;
        int nc = grid[0].length;
        int num_islands = 0;

        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;
                    grid[r][c] = '0';
                    Queue neighbors = new linkedList<>();
                    neighbors.add(r * nc + c);
                    while (!neighbors.isEmpty()) {
                        int id = neighbors.remove();
                        int row = id / nc;
                        int col = id % nc;
                        if (row - 1 >= 0 && grid[row-1][col] == '1') {
                            neighbors.add((row-1) * nc + col);
                            grid[row-1][col] = '0';
                        }
                        if (row + 1 < nr && grid[row+1][col] == '1') {
                            neighbors.add((row+1) * nc + col);
                            grid[row+1][col] = '0';
                        }
                        if (col - 1 >= 0 && grid[row][col-1] == '1') {
                            neighbors.add(row * nc + col-1);
                            grid[row][col-1] = '0';
                        }
                        if (col + 1 < nc && grid[row][col+1] == '1') {
                            neighbors.add(row * nc + col+1);
                            grid[row][col+1] = '0';
                        }
                    }
                }
            }
        }

        return num_islands;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号