BFS算法(广度优先搜索)java

BFS介绍

BFS:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
BFS 的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。
BFS 出现的常见场景,问题的本质就是让你在一幅「图」中找到从起点start到终点target的最近距离。
嘛意思呢,假设你进入一个迷宫,里面有各个分叉口,你刚开始从入口进入,当走到分叉口的时候,在求生技能的加持下,你学会了分身术。每当你走到分叉口,你都分身成好几个你分别进入还没走过的通道。各自探寻下一个分叉口。只要其中一个找到了出口,求生技能就会发挥作用将你的所有元神召集在出口处合并,然后成功走出迷宫。走出迷宫的路径(步数)就是找到出口的这个分身所走的路径,也就是最短路径。呃。。。晕了,好吧,慢慢来,先看看一技能(框架)

// 计算从起点start到终点target的最近距离
    int BFS(Node start, Node target) {
   
        Queue<Node> q;      // 核心数据结构
        Set<Node> visited;  // 避免走回头路

        q.offer(start);     // 将起点加入队列
        visited.add(start);
        int step = 0;       // 记录扩散的步数

        while (q not empty) {
   
            int sz = q.size(); // 挨个取出同一层深度(迷宫分叉口)的所有节点
            // 将当前队列中的所有节点向四周扩散(分身)
            for (int i = 0; i < sz; i++) {
   
                Node cur = q.poll(); // poll()从头部删除元素,若头部无元素,返回null

                // !!注意,这里判断是否到达终点
                if (cur is target)
                    return step;
                // 将cur的相邻节点加入队列
                for (Node x : cur.adj()) {
    // cur.adj()泛指cur相邻的节点,比如在二维数组中,cur上下左右的位置都是相邻节点
                    if (x not in visited) {
   
                        // 加入队列,以便后续寻找该节点的相邻节点(目标节点有可能就在该节点的相邻节点中哦,不要让他跑掉)
                        q.offer(x);
                        // 做标记,该节点已经遍历过了,防止在后面遍历他的子节点时,子节点把他作为临近节点再次加入队列,那样会进入死循环
                        visited.add(x);
                    }
                }
            }
            // 划重点,更新步数在这里,即while循环中的最后一步,这样就能保证while再一次执行时q中剩余的是同一层节点
            step++;
        }
    }

就这?就这?对,就这。。emmm~ 牛刀有了,来只鸡 ~

/*
 * leetcode 第111题:二叉树的最小深度
 * 给定一个二叉树,找出其最小深度
 * 最小深度是从根节点到最近叶子节点的最短路径上的节点数量,叶子节点是没有子节点的节点
 * 示例:给定二叉树[3, 9, 20, null, null, 15, 7]
 *     3
 *    / \
 *   9  20
 *     / \
 *    15  7
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值