Leetcode - 广度优先遍历专题
> 基础
1. 广度遍历优先是从给定的root节点开始,逐层次的向下访问各个节点;
2. 实现的方式是通过队列的先进先出,将从root节点开始的左孩子和右孩子压入到队列中,并顺序取出;
3. 由于是用队列实现,因此不存在用递归实现的方式。
下面是基本的广度遍历优先算法:
1 def breadthFirstSearch(root): 2 queue = [] 3 queue.append(root) 4 while queue: 5 node = queue[0] 6 queue.pop(0) 7 print ('%d ' % node.data) 8 if node.left: 9 queue.append(node.left) 10 if node.right: 11 queue.append(node.right)
> Leetcode -
Binary Tree Level Order Traversal
Note:这是一道二叉树的广度优先遍历练习题,不同之处在于要分辨出每个Node所在的深度,并给出每个深度所有Node的集合。解题思路有两种,一种是使用两个队列,分别称之为主队列和副队列,循环主队列里的所有节点,并把所有的孩子放在副队列中。直到当主队列为空时,把副队列的所有结点赋给主队列,清空副队列,并进入到下一级深度的循环。还有一种是使用flag,在root结点后加入flag,然后每次访问到flag的时候,就意味着访问到了该深度所有的Node,并且下一个深度的所有Node都加入到了队列中,这时再加入一个flag,依此循环。这里使用第二种方法。
Answer:
1 def levelOrder(root): 2 if root is []: 3 return [] 4 flag = TreeNode(65536) 5 queue, line, res = [], [], [] 6 queue.append(root) 7 queue.append(flag) 8 while queue: 9 node = queue[0] 10 queue.pop(0) 11 if node.val is not 65536: 12 line.append(node.val) 13 if node.left: 14 queue.append(node.left) 15 if node.right: 16 queue.append(node.right) 17 else: 18 res.append(line) 19 if not queue: 20 return res 21 queue.append(flag) 22 line = []
> Leetcode -
Binary Tree Level Order Traversal II
Note: 本题和上一道题的基本思路相似,唯一的不同是返回值是从最深一层的结点向root结点的方向,只要在插入res的时候位置选择在最开始就可以了。这里尝试使用上面提到的两个队列的实现方式。
Answer:
1 def levelOrderBottom(root): 2 if root is []: 3 return [] 4 queue, queue2, line, res = [], [], [], [] 5 queue.append(root) 6 while queue: 7 node = queue[0] 8 queue.pop(0) 9 line.append(node.val) 10 if node.left: 11 queue2.append(node.left) 12 if node.right: 13 queue2.append(node.right) 14 if not queue: 15 res.insert(0, line) # insert the nodes from front 16 queue, queue2, line = queue2, [], [] 17 return res
> Leetcode -
Binary Tree Zigzag Level Order Traversal
Note:这道题是要按照Z字形的方式访问各个Node,我在最初写的时候犯了一个错误,我是分单双将每层的Node按照正或反的方向记录到队列中,这样会有一个问题,比如针对下面的输入[1,2,3,4,#,#,5],由于我的第二层结点是以right->left方向记录的,也就是到第二层为止输出为[1,3,2];在将下一深度的结点入队的时候,我就是先访问的3,后访问的2,因此5先进入,4后进入,这样第三级由于是left->right输出的,我的最终输出就是[[1], [3, 2], [5, 4]],而正确的输出其实是[[1], [3, 2], [4, 5]]。其实这个问题可以和之前的很类似,只是在将line压入res的时候,隔行做一下python list的反转就可以了。
Answer:
1 def zigzagLevelOrder(root): 2 if root is []: 3 return [] 4 flag = TreeNode(65536) 5 queue, line, res = [], [], [] 6 direction = 0 7 queue.append(root) 8 queue.append(flag) 9 while queue: 10 node = queue[0] 11 queue.append(0) 12 if node.val is not 65536: 13 line.append(node.val) 14 if node.left: 15 queue.append(node.left) 16 if node.right: 17 queue.append(node.right) 18 else: 19 if direction % 2 == 0: 20 res.append(line) 21 else: 22 res.append(line[::-1]) 23 if not queue: 24 return res 25 queue.append(flag) 26 line = [] 27 direction += 1
转载于:https://www.cnblogs.com/zhouweihit/p/4058111.html
Leetcode - 广度优先遍历专题相关推荐
- 广度优先遍历算法-01寻找制高点问题
寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...
- 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释
二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...
- 搜索---广度优先遍历、深度优先遍历、回溯法
参考文章:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%9 ...
- 算法笔记 揭开广度优先遍历BFS的神秘面纱 HERODING的算法之路
揭开广度优先遍历BFS的神秘面纱 前言 1. 审题 1.1 树的BFS 1.2 图的BFS 2. 解法 2.1 树的BFS 2.2 图的BFS 3. 总结 前言 最近到了面试的高峰时期,前段时间也刷了 ...
- 【算法】广度优先遍历 (BFS)
目录 1.概述 2.代码实现 3.应用 1.概述 (1)广度优先遍历 (Breadth First Search),又称宽度优先遍历,是最简便的图的搜索算法之一. (2)已知图 G = (V, E) ...
- Leetcode(5)——遍历,并查集,回溯法和二分查找
格式: 题号+题名+简单思路+code 遍历 深度优先遍历和广度优先遍历 很多dfs可以用Union Find解决 T130: 被围绕的区域 DFS的写法 func solve(board [][]b ...
- 图论算法(5):图的广度优先遍历 BFS
本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...
- Python实现深度优先遍历(DFS)和广度优先遍历(BFS)
一,简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫 ...
- 图的遍历 深度与广度优先遍历
图的遍历 本文作者 Mr.赵 Email: lovelyalan@foxmail.com 原创文章,转载标明作者,部分图片素材来自网络 从图中某一顶点出发遍历图中其余顶点,且使每一个顶点仅被访问一次, ...
最新文章
- Lync与Exchange 2013 UM集成:Exchange 配置
- 5G全球声量升级:Verizon宣布固定+移动齐步走,中国第三阶段试验倒计时
- 【数据挖掘笔记三】数据预处理
- ITK:创建高斯导数内核
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
- golang的sync包例子
- PHP中的中文截取乱码问题_gb2312_utf-8
- JRebel Idea热更新插件
- 利用NAS寻找最佳GAN:AutoGAN架构搜索方案专为GAN打造
- 基于 FFMPEG 的音频编解码(三):音频编码
- 一用户使用LTC以168万美元的价格购入收藏界“圣杯“卡片
- 解决git总是提示输入用户名密码
- Poj 1936,3302 Subsequence(LCS)
- 2020-8-4 Codeforces摸鱼报告
- 数据结构银行排队系统c语言,数据结构银行排队系统.doc
- 【微信小程序】项目实战—抽签应用
- 文字怎么转化计算机代码,如何把文字转换成代码
- 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW)
- 重庆邮电大学计算机学硕考研经验,重庆邮电大学计算机考研复试备考经验及经过...
- 2021-05-26SEO关键词KPI考核指标有哪些
热门文章
- 利用MATLAB对数据进行切片并绘制图表
- java interface_Java中的接口(interface)
- 如何用Postman mock服务?
- python函数递归 字符串反转
- FindChildControl与FindComponent(动态创建的控件要通过Owner.FindComponent去找该控件)
- 美元指数DXY短线走高10逾点,现报90.77
- SAP License:SAP复制和默认快捷小贴士
- SAP License:ERP失败案例集
- uTools:一个方法“改变”uTools的插件安装/数据目录
- Yii 文件上传类的使用