二叉树层次遍历

二叉树层次遍历的基本算法在本文中不提及。本文内容为,在二叉树层次遍历中,为何选用队列这样一种数据结构。

不使用额外数据结构

首先,假设我们不使用额外的数据结构,只使用 1 个指针:

访问第一层:没有任何问题,因为 root 是已知的。

访问第二层:也没有任何问题,因为我们知道第二层所有结点的 parent

访问第三层:问题来了,我们不知道第三层所有结点的 parent

那该怎么办呢?访问第三层的时候一定需要知道第二层结点的位置,于是我们就想,不如把第二层结点保存起来。这样,在遍历第三层的时候,就可以拿到第二层结点,通过每个第二层结点的 left 和 right 指针完成第三层的遍历。

把刚刚的过程推广一下,若无法访问第 n 层,那么是由于无法获得 n - 1 层结点导致的。因此需要保存 n - 1 层结点的信息,而且是在遍历 n - 1 层结点保存的。

那么问题又来了:使用什么数据结构保存第 n - 1 层结点信息?

如何保存 n - 1 层结点

咱们一个个来看:Stack、Queue、Set、Map。以访问上图中第 3 层结点(即 4 号和 5 号)为例:

  1. 如果使用 Stack,那么遍历完第 2 层后,栈中元素为 2 和 3。在遍历第 3 层时,需要取出栈中全部元素 2 和 3,并将所有第 3 层结点都遍历完,然后再一次性把结点放入栈中,以便遍历第 4 层。注意需满足所有一次性,不然会导致两层元素混杂在栈中,无法实现层次遍历。这样做其实并不简单,又需要额外的数据结构来存储。

  2. 如果使用 Queue,那么遍历完第 2 层后,队列中元素为所有第 2 层结点,即 2 和 3。在遍历第 3 层时,只需要每次从中取出一个结点,然后访问该结点的左右孩子,并将左右孩子放在队列中。这里只取出一个结点,而不需要全部取出的原因是:由于队列满足先进先出(FIFO)的特性,由于第 2 层结点在第 3 层结点之前进入队列,那么第 3 层结点一定会放在第 2 层结点之后,以保证第 2 层结点会先出队列

  3. 则不然,栈是后进先出(LIFO)的,先进去的后出来。假设我们从栈中取出 2 号结点后,将 4 和 5 放入栈中,那么 3号结点则会在栈较深的位置,比 4 和 5后出来。栈破坏了层与层之间的先后顺序,不能适用于层次遍历。

  4. Set 和 Map 并不会维持元素之间的先后顺序,它们要么基于哈希实现,要么基于元素实际值的大小实现,不会记录元素进入容器的先后顺序,因此同样不适合层次遍历。

总结:父节点组成的队列

因此,在遍历每个元素时,都需要将当前元素入队列。每个入队列的元素承担着访问下一层元素的使命,同时,每个元素都需要借助队列中的元素才能够访问到。不过,这里也有一个例外,对于整棵树的根节点,无需通过队列来获取。它从一开始就是已知的。

二叉树层次遍历:队列相关推荐

  1. [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

    目录: 1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次 ...

  2. 数据结构-二叉树层次遍历

    首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...

  3. 树(二叉树层次遍历输出及二叉树前序遍历输入)

    前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况. 定义结构体 struct BiNode{char data;BiN ...

  4. (数据结构)二叉树层次遍历

    二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队:而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后 ...

  5. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

  6. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  7. 二叉树层次遍历(借助队列实现)

    /*按层次遍历二叉树*经调试可运行源码及分析如下: ***/ #include <stdlib.h> #include <iostream> #include <queu ...

  8. 用队列实现二叉树层次遍历

    在二叉树的基础上,层次遍历时采用队列读取 核心代码 void levorder(BitTNode* t) {     BiTree Queue[100],p; //创建队列     int front ...

  9. 二叉树的层次遍历_【腾讯面试热身题】二叉树层次遍历(动画展示)

    二叉树的层次遍历同时涉及到树和队列两种数据结构的操作,因此大厂很喜欢用来作为面试的热身题.作者不少去腾讯的小伙伴,都反映,这种题一定要非常熟练,不然会被直接pass. 1 题目描述 给定一个二叉树,按 ...

最新文章

  1. code blocks 代码颜色_vuepress中实现代码折叠、高亮
  2. 哈尔滨阳光计算机学院是不是黄了,黑龙江这4所野鸡大学,常被误认为是名校,实则害人不浅...
  3. php左侧,php左侧补零
  4. java 实现 常见排序算法(四)基数排序
  5. LeetCode篇之栈:20(括号匹配问题)
  6. greenplum查询超时_greenplum 集群故障(Sorry,too many clients already )排查:
  7. ListMapString,Object之按照某个字段排序
  8. 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
  9. 编译carrot2发布
  10. java.lang.IllegalStateException报警
  11. NB-IOT(BC95模组)对接华为中国电信物联网平台上行数据与下行数据总流程
  12. 云计算在我们日常生活中,主要有哪些应用
  13. 个人博客网站的设计与实现
  14. 柯桥增值税留抵如何退税?
  15. ddos防火墙防御假人攻击测评
  16. git fsck --lost-found
  17. 安装 - LNMP一键安装包
  18. MATLAB计算二元一次方程组
  19. 运维实操——zabbix监控结合睿象云报警平台及API调用
  20. 将自己的网站上传至服务器并通过域名进行访问

热门文章

  1. 用Java实现QQ登录
  2. 【Web篇】(6.3) ❀ 03. FortiWeb VM 下载与安装 ❀ FortiWeb 攻防演练
  3. matlab中.2表示,在MATLAB中,命令“zero(2)”表示()
  4. Java中由继承得到的类成为_【填空题】Java中由继承而得到的类成为________,被继承的类称为父类。...
  5. 初级Html—模仿电商销售平台图书列表
  6. mysql常见的错误代码
  7. Flutter 学习 - Widget 之 对话框
  8. 运营界大牛的10年经验干货,拨开运营的谜团
  9. python 进度条_python进度条
  10. String类型转换成数组