广度优先探索例题java_LeetCode:广度优先搜索(BFS)算法(常见面试题)

2023-10-27

今天推荐一道常见的面试算法题。比较实用也比较常见

一、认识广度优先搜索算法

广度优先搜索(BFS)算法是图的一种遍历方法,它的核心思想是从图的某一个节点开始,依次遍历相邻节点,再从这些相邻节点继续向外层节点遍历,直到连通图的所有节点均被访问到。

47361cb5777bc6529078f900070c756a.png

如上图所示,A、B、C、D、E、F六个节点构成了连通图。我们使用广度优先搜索算法对该连通图进行遍历,从A点出发,找到A点的相邻节点B点和F点,再分别找到B点和F点的相邻节点C点和E点,最终找到C点和E点的共同相邻节点D点。因此我们得到的遍历结果为ABFCED。

二、Leetcode常见广度优先搜索形式

当我们打开Leetcode的广度优先搜索标签,查看相关算法题时会发现,很多题是将连通图简化为树或二叉树的形式展示。因此我们可以从树/二叉树的角度分析广度优先搜索算法,只要搞懂了树的广度优先搜索,图的广度优先搜索只是相邻节点的选择差异罢了。

广度优先搜索算法在树/二叉树中被简化为层次遍历算法,即从树的根节点出发,依次遍历根节点的孩子,再分别将这些孩子作为根节点,循环上述操作,直至将所有的节点全部遍历结束。

如下图所示,树的层次遍历就是一种特殊的广度优先搜索。根据上文的遍历规则不难得出树的广度优先搜索序列为ABCDEFG。

3eeda25a12e429508e7e8efc348ed2d5.png

三、一道算法题讲解具体的BFS实现思路

我选取了Leetcode上一道典型的广度优先搜索算法给大家整理一下BFS的算法基本实现思路,题目如下:

8f99032f326528b3a0d29f0a6097f9ac.png

思路: 从题意中我们不难看出,该题的核心问题就是求出二叉树的每一层中最右边的节点的值并将其存入数组最后返回该数组。很显然,利用广度优先搜索算法可以很容易将每一层的最右节点求出。

对于广度优先搜索算法,我们需要申请一个辅助队列帮助我们存储每一层的每一个节点。首先需要对根节点判空,若根节点为空则直接返回一个空数组,否则将根节点存入队列中。接下来我们需要将队列中该层的所有节点取出,并找出它们的孩子节点存入队列中。需要注意的是,到了最右节点时应将该节点的值存入数组。循环该过程直至遍历二叉树的所有节点即可得出最终的结果。class Solution {

public List rightSideView(TreeNode root){

List ans = new ArrayList<>();

if (root == null) {

return ans;

}

Queue queue = new LinkedList<>();

queue.add(root);

while (!queue.isEmpty()) {

int count = queue.size();

TreeNode currentNode = null;

while (count > 0) {

count--;

currentNode = queue.poll();

if (currentNode.left != null) {

queue.add(currentNode.left);

}

if (currentNode.right != null) {

queue.add(currentNode.right);

}

}

ans.add(currentNode.val);

}

return ans;

}

}

算法复杂度分析:算法需要访问该二叉树中的每个节点并且每个节点的访问时间为O(1),所以最终的事件复杂度为O(n)。对于空间复杂度,我们申请了一个辅助队列帮助存储二叉树节点,最终的空间复杂度也可表示为O(n)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

广度优先探索例题java_LeetCode:广度优先搜索(BFS)算法(常见面试题) 的相关文章

随机推荐

  • Java基础笔记:Collection集合框架

    Collection框架 Collection 单列集合类的根接口 用于存储一系列符合某种规则的元素 它有两个重要的子接口 分别是java util List和java util Set List的特点是元素有序 元素可重复 Set的特点是
  • C语言联合体

    一 联合体的概念 联合 union 是一个能在同一个存储空间里 但不同时 存储不同类型数据的复合数据类型 大致结构如下 n union foo 定义一个联合类型foo n q int digit q double bigfl 10 q ch
  • 浅学Linux内核MMU

    1 MMU基本知识 1 1 什么是MMU MMU是 MemoryManagementUnit 的缩写即 内存管理单元 针对各种CPU MMU是个可选的配件 MMU负责的是虚拟地址与物理地址的转换 提供硬件机制的内存访问授权 现代 CPU 的
  • Google TPU的发展历程与思考(二)

    TPU v2 与 TPU v3 相较于 TPU v1 只能用于推理 TPU v2 致力于解决训练难题 TPUv2 设计目标 训练与推理 仅仅是转变方向而已吗 TPUv2 誓要解决更难的训练任务 事实上 训练与推理的难度相差比想象的要大 1
  • Acwing 1414.牛异或

    输入样例 5 1 0 5 4 2 输出样例 6 4 5 刚开始看到这个题 我是毫无思绪 看了一下题解 https www acwing com video 2339 老师说这个是最大异或对的变形 于是我去找了一下最大异或对 看完之后我只能想
  • 关于Mysql-unknow-column-in-where-clause

    写在前边 已经很久不更新了啊 整个2月份几乎没有遇到什么新鲜事 直到昨天我又犯了一次傻 貌似只有我犯傻的时候才有材料可以跟大家分享 问题表现 mysql 报错 unknow column sys in where clause 事实上这是个
  • GD32F303X SPI调试遇到的问题总结

    1 下面是一些常规配置 SPI0为例 define SPI0 CS ENABLE GPIO BC GPIOA GPIO PIN 4 LOW define SPI0 CS DISABLE GPIO BOP GPIOA GPIO PIN 4 H
  • c语言long和long long的取值范围

    溢出和取值范围 C语言的整型溢出问题 整数溢出 int long int long long int 占用字节 C和指针 中写过 long与int 标准只规定long不小于int的长度 int不小于short的长度 double与int类型
  • UGUI屏幕自适应

    关键点 0 自适应的测试 通过设置多种的屏幕大小进行测试 测试时最好要打开Maximize on Play 在屏幕放大的情况下容易观察自适应情况 1 所谓的自适应 就是 a 保持相对位置不变 例如UI设计在屏幕的左上角 那么在各种的分辨率下
  • java多线程和高并发系列一 & JMM、Synchronized、volatile

    目录 什么是JMM模型 概念 JVM的工作 JMM的工作 总结 JMM不同于JVM内存区域模型 主内存 工作内存 数据同步八大原子操作 同步规则分析 并发编程的可见性 原子性于有序性问题 原子性 可见性 有序性 volatile内存语义 v
  • js复制图片,支持jpg和png

    直接上关键代码 copy jpg url jpg 示例 复制图片 支持jpg png 传入图片url即可 function copy jpg url var canvas document createElement canvas 创建一个
  • unity 延迟等待执行

    关于unity延迟执行网上也有很多了 我这里只是封装下 让写代码变得更加优雅 使用更加方便 一个问题想要表述清楚 读者也能看明白 无非3个点 What 要说的是什么 How 怎么用你这个东西 什么情况下有用 Why 为什么要这么做 这么做有
  • 3天快速了解区块链技术 day01

    文章目录 区块链技术与应用相关概念 关于作者 作者介绍 前言 一 区块链基础概念 1 1 区块链历史 1 2 区块链和区块的定义 1 3 区块链分类 1 4 区块链价值 1 5 区块链应用领域 1 6 区块链特点 1 7 区块链关键技术 二
  • 使用cJSON解析JSON字符串

    JSON学习 使用cJSON解析 使用cJSON解析JSON字符串 一 为何选择cJSON 我们在使用JSON格式时 如果只是处理简单的协议 可以依据JSON格式 通过对字符串的操作来进行解析与创建 然而随着协议逐渐复杂起来 经常会遇到一些
  • Altium Designer 18 速成实战 第四部分 PCB库的设计(七)3D PCB封装的创建

    Altium Designer 18 速成实战 第四部分 PCB库的设计 七 3D PCB封装的创建 目录 一 3D元件体绘制3D PCB封装 1 放置3D元件体 2 绘制成下图所示 3 根据下图 图来自百度 调整属性 二 3D元件体绘制3
  • 修改weblogic控制台路径

    我们在使 weblogic控制台时 出于安全的考虑需要对weblogic的console进行设置 修改默认的访问路径 有两种方法 任选一种都可以 一 在web控制台进行修改 先使用默认的ip 端口 console登录到weblogic控制台
  • Basic Level 1074 宇宙无敌加法器 (25分)

    题目 地球人习惯使用十进制数 并且默认一个数字的每一位都是十进制的 而在 PAT 星人开挂的世界里 每个数字的每一位都是不同进制的 这种神奇的数字称为 PAT数 每个 PAT 星人都必须熟记各位数字的进制表 例如 0527 就表示最低位是
  • Ubuntu 14.04 将其他盘挂载到/home的子目录下

    Ubuntu 14 04 将其他盘挂载到 home的子目录下 当安装完Ubuntu系统 由于当时没有注意 分配的分区空间太小 经过一段时间安装了各式各样的软件后 常常会遇到 home目录下空间不够的情况 这时除了卸载软件以及重装系统以外 还
  • MDK 编译错误:multiply defined (重复定义)

    这个代码实现很简单 出现重复定义首先检查了自己的头文件 发现没问题 后来经过师兄的点拨 发现他提示后面有 表示有两个头文件key1 c和key c 马上检查了工程 果然发现有两个 c文件 删除一个即可解决问题
  • 广度优先探索例题java_LeetCode:广度优先搜索(BFS)算法(常见面试题)

    今天推荐一道常见的面试算法题 比较实用也比较常见 一 认识广度优先搜索算法 广度优先搜索 BFS 算法是图的一种遍历方法 它的核心思想是从图的某一个节点开始 依次遍历相邻节点 再从这些相邻节点继续向外层节点遍历 直到连通图的所有节点均被访问