算法模板-广度优先遍历
本文转载自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
补充说明
面对“存在性检验”的搜索题,应当优先考虑基于递归的深度优先遍历和基于队列的广度优先遍历。
算法模板-广度优先遍历相关推荐
- 【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)
一. 搜索算法 深度优先搜索和广度优先搜索是最暴力的图的搜索算法.算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径.(代码均是找到两个节点之间的路径) 广度优先搜索是一层一层搜索 ...
- 【算法】广度优先遍历 (BFS)
目录 1.概述 2.代码实现 3.应用 1.概述 (1)广度优先遍历 (Breadth First Search),又称宽度优先遍历,是最简便的图的搜索算法之一. (2)已知图 G = (V, E) ...
- C++实现图的深度优先遍历和广度优先遍历
图的深度和广度优先遍历 图的深度优先遍历 1.算法思想 2.邻接矩阵构造图 3.邻接表构造图 图的广度优先遍历 1.算法思想 2.邻接矩阵构造图 图的深度优先遍历 1.算法思想 (1)从图中的某个初始 ...
- 深度优先算法和广度优先算法
深度优先算法和广度优先算法 介绍 图的定义 邻接表 邻接矩阵 广度优先算法 广度优先算法的实现 广度优先算法的应用 深度优先算法 深度优先算法的实现 后续 介绍 在数据结构中,树和图可以说是不可或缺的 ...
- 广度优先遍历算法-01寻找制高点问题
寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...
- 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)
文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...
- 算法笔记 揭开广度优先遍历BFS的神秘面纱 HERODING的算法之路
揭开广度优先遍历BFS的神秘面纱 前言 1. 审题 1.1 树的BFS 1.2 图的BFS 2. 解法 2.1 树的BFS 2.2 图的BFS 3. 总结 前言 最近到了面试的高峰时期,前段时间也刷了 ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程
图的邻接矩阵表示 通常图的表示有两种方法:邻接矩阵,邻接表. 本文用邻接矩阵实现,一是代码量更少,二是代码风格也更贴近C语言.但不论是图的哪种实现方式,其基本的实现思想是不变的. 1:节点的信息,我们 ...
最新文章
- 部署Symantec Antivirus 10.0网络防毒服务器之六
- Ubuntu开发Java教程_Ubuntu下Java环境的搭建基础教程
- MySQL高级 - 案例 - 需求及环境准备
- Android中常用的一些方法总结的工具类
- Codeforces Round #734 (Div. 3) (A-D1)
- python自定义函数func_python自定义函数与面向对象
- jQuery : ddSlick 自定义select下拉框 custom drop down with images and description.
- Java 并发数据结构
- 神经网络之文本情感分析(三)
- 英伟达的“千人摩擦计划”:几千个智能体互相玩耍,学习跑酷更轻松
- Qlik发布中国战略,为实现更大成功而不懈努力
- 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
- 个人对ReadyBoost加速你的Win7的看法
- python3 collections模块 tree_python3上的ete3模块无法导入TreeStyle、faces、AttrFace、NodeSty...
- Linux系列(五)、Vim编辑器的使用、账号用户组的管理、磁盘管理、进程管理
- javafx 教程_Swing和JavaFX:使用JFXPanel
- JVM---垃圾回收概述及相关概念
- C++拷贝赋值与移动赋值函数
- 百度网盘提速法,不用插件,不用安装脚本
- c++中获得对象类型 typeid 与 type_info