本文转载自Maple博客的算法模板-01背包问题,转载请注明出处。

简介

广度优先遍历(Breadth-First-Search,BFS),其特点便体现在广度,它是按“层“”来处理顶点,距离开始点最近的那些顶点首先被访问,而最远的那些顶点则最后被访问,这个和树的层序遍历很像。以下图为例:

BFS尽可能地搜索与同一个节点连接的所有节点,再进行下一次搜索。

队列实现

显然,DFS一般都与由队列实现:

def BFS(node):q = collections.deque([root])while q:temp = q.popleft()print(temp.val)q.append(temp.nexts) # 所有与temp相连的节点均入队列

练习题1

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
处。
示例1:

输入:m = 2, n = 3, k = 1
输出:3

示例2:

输入:m = 3, n = 1, k = 0
输出:1

这题需要判断机器人能走到的区域内的格子数量,代码如下:

class Solution:def movingCount(self, m: int, n: int, k: int) -> int:q = collections.deque([(0, 0)])visited = set()count = 0while q:loc1, loc2 = q.popleft()           if loc1 < m and loc2 < n and (loc1, loc2) not in visited:visited.add((loc1, loc2))loc_k = sum([int(i) for i in str(loc1) + str(loc2)])if loc_k <= k:count += 1q.append((loc1 + 1, loc2))q.append((loc1, loc2 + 1))return count

练习题2

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
示例:

给定二叉树:3/ \9  20/  \15   7输出为:[[3],[20,9],[15,7]
]

这题就是树的层序遍历,在遍历时顺便记录层数,奇数层和偶数层输出顺序不同,代码如下:

class Solution:def levelOrder(self, root: TreeNode) -> List[List[int]]:if not root: return []q, ans, flag = collections.deque(), [], 1q.append(root)while q:cur = collections.deque()while q:cur.append(q.popleft())ans_cur = []while cur:temp = cur.popleft()ans_cur.append(temp.val)if temp.left: q.append(temp.left)if temp.right: q.append(temp.right)ans.append(ans_cur if flag % 2 else ans_cur[::-1])flag += 1return ans

补充说明

面对“存在性检验”的搜索题,应当优先考虑基于递归的深度优先遍历和基于队列的广度优先遍历。

算法模板-广度优先遍历相关推荐

  1. 【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)

    一. 搜索算法 深度优先搜索和广度优先搜索是最暴力的图的搜索算法.算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径.(代码均是找到两个节点之间的路径) 广度优先搜索是一层一层搜索 ...

  2. 【算法】广度优先遍历 (BFS)

    目录 1.概述 2.代码实现 3.应用 1.概述 (1)广度优先遍历 (Breadth First Search),又称宽度优先遍历,是最简便的图的搜索算法之一. (2)已知图 G = (V, E) ...

  3. C++实现图的深度优先遍历和广度优先遍历

    图的深度和广度优先遍历 图的深度优先遍历 1.算法思想 2.邻接矩阵构造图 3.邻接表构造图 图的广度优先遍历 1.算法思想 2.邻接矩阵构造图 图的深度优先遍历 1.算法思想 (1)从图中的某个初始 ...

  4. 深度优先算法和广度优先算法

    深度优先算法和广度优先算法 介绍 图的定义 邻接表 邻接矩阵 广度优先算法 广度优先算法的实现 广度优先算法的应用 深度优先算法 深度优先算法的实现 后续 介绍 在数据结构中,树和图可以说是不可或缺的 ...

  5. 广度优先遍历算法-01寻找制高点问题

    寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...

  6. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

    文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...

  7. 算法笔记 揭开广度优先遍历BFS的神秘面纱 HERODING的算法之路

    揭开广度优先遍历BFS的神秘面纱 前言 1. 审题 1.1 树的BFS 1.2 图的BFS 2. 解法 2.1 树的BFS 2.2 图的BFS 3. 总结 前言 最近到了面试的高峰时期,前段时间也刷了 ...

  8. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  9. 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

    图的邻接矩阵表示 通常图的表示有两种方法:邻接矩阵,邻接表. 本文用邻接矩阵实现,一是代码量更少,二是代码风格也更贴近C语言.但不论是图的哪种实现方式,其基本的实现思想是不变的. 1:节点的信息,我们 ...

最新文章

  1. 部署Symantec Antivirus 10.0网络防毒服务器之六
  2. Ubuntu开发Java教程_Ubuntu下Java环境的搭建基础教程
  3. MySQL高级 - 案例 - 需求及环境准备
  4. Android中常用的一些方法总结的工具类
  5. Codeforces Round #734 (Div. 3) (A-D1)
  6. python自定义函数func_python自定义函数与面向对象
  7. jQuery : ddSlick 自定义select下拉框 custom drop down with images and description.
  8. Java 并发数据结构
  9. 神经网络之文本情感分析(三)
  10. 英伟达的“千人摩擦计划”:几千个智能体互相玩耍,学习跑酷更轻松
  11. Qlik发布中国战略,为实现更大成功而不懈努力
  12. 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
  13. 个人对ReadyBoost加速你的Win7的看法
  14. python3 collections模块 tree_python3上的ete3模块无法导入TreeStyle、faces、AttrFace、NodeSty...
  15. Linux系列(五)、Vim编辑器的使用、账号用户组的管理、磁盘管理、进程管理
  16. javafx 教程_Swing和JavaFX:使用JFXPanel
  17. JVM---垃圾回收概述及相关概念
  18. C++拷贝赋值与移动赋值函数
  19. 百度网盘提速法,不用插件,不用安装脚本
  20. c++中获得对象类型 typeid 与 type_info

热门文章

  1. Curator实现分布式锁的基本原理-createsTheLock
  2. 基于Xml 的IOC 容器-获得配置路径
  3. Redis中的代理Sharding
  4. Redis中缓存Lua 脚本
  5. 自定义线程池-线程池类和测试类编写
  6. 百万数据报表导出:需求以及思路分析
  7. (常用API)正则表达式语法规则
  8. 内置方法-del方法和对象的生命周期
  9. Spring Session官方介绍及spring框架学习方法
  10. Linux Capabilities 入门教程--进阶实战篇