> 基础

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 - 广度优先遍历专题相关推荐

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

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

  2. 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释

    二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...

  3. 搜索---广度优先遍历、深度优先遍历、回溯法

    参考文章:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%9 ...

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

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

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

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

  6. Leetcode(5)——遍历,并查集,回溯法和二分查找

    格式: 题号+题名+简单思路+code 遍历 深度优先遍历和广度优先遍历 很多dfs可以用Union Find解决 T130: 被围绕的区域 DFS的写法 func solve(board [][]b ...

  7. 图论算法(5):图的广度优先遍历 BFS

    本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...

  8. Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

    一,简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫 ...

  9. 图的遍历 深度与广度优先遍历

    图的遍历 本文作者 Mr.赵 Email: lovelyalan@foxmail.com 原创文章,转载标明作者,部分图片素材来自网络 从图中某一顶点出发遍历图中其余顶点,且使每一个顶点仅被访问一次, ...

最新文章

  1. Lync与Exchange 2013 UM集成:Exchange 配置
  2. 5G全球声量升级:Verizon宣布固定+移动齐步走,中国第三阶段试验倒计时
  3. 【数据挖掘笔记三】数据预处理
  4. ITK:创建高斯导数内核
  5. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
  6. golang的sync包例子
  7. PHP中的中文截取乱码问题_gb2312_utf-8
  8. JRebel Idea热更新插件
  9. 利用NAS寻找最佳GAN:AutoGAN架构搜索方案专为GAN打造
  10. 基于 FFMPEG 的音频编解码(三):音频编码
  11. 一用户使用LTC以168万美元的价格购入收藏界“圣杯“卡片
  12. 解决git总是提示输入用户名密码
  13. Poj 1936,3302 Subsequence(LCS)
  14. 2020-8-4 Codeforces摸鱼报告
  15. 数据结构银行排队系统c语言,数据结构银行排队系统.doc
  16. 【微信小程序】项目实战—抽签应用
  17. 文字怎么转化计算机代码,如何把文字转换成代码
  18. 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW)
  19. 重庆邮电大学计算机学硕考研经验,重庆邮电大学计算机考研复试备考经验及经过...
  20. 2021-05-26SEO关键词KPI考核指标有哪些

热门文章

  1. 利用MATLAB对数据进行切片并绘制图表
  2. java interface_Java中的接口(interface)
  3. 如何用Postman mock服务?
  4. python函数递归 字符串反转
  5. FindChildControl与FindComponent(动态创建的控件要通过Owner.FindComponent去找该控件)
  6. 美元指数DXY短线走高10逾点,现报90.77
  7. SAP License:SAP复制和默认快捷小贴士
  8. SAP License:ERP失败案例集
  9. uTools:一个方法“改变”uTools的插件安装/数据目录
  10. Yii 文件上传类的使用