前言

在《什么是二叉树》中,我们介绍了二叉树的创建(插入),查找和删除,本文将介绍二叉树的遍历。而二叉树遍历有多种形式,他们也可以应用在不同的场景中,常见的深度优先遍历方式有前序遍历,中序遍历,后序遍历,而不常用广度优先遍历方式有层次遍历。本文将会对以上遍历方式都进行介绍。

二叉树的遍历

常见遍历顺序有以下几种:

  • 前序遍历,先检查节点值,然后递归遍历左子树和右子树
  • 中序遍历,先遍历左子树,然后检查当前节点值,最后遍历右子树
  • 后序遍历,先递归遍历左右子树,然后检查当前节点值
  • 层次遍历,如名字所言,从第一层开始,一层一层往下遍历

以下图为例,我们一一介绍四种遍历方式。

前序遍历

  • 输出当前节点值10,然后输出左子树,最后输出右子树;
  • 对于其左子树来说,同样以这样的顺序,则先输出5,然后输出左子树4,最后输出右子树8;
  • 对于其右子树,同样以这样的顺序,则先输出19,然后输出左子树13,最后输出右子树24;
  • 最终得到前序遍历输出为:10,5,4,8,19,13,24。

前序遍历代码:

void 

中序遍历:

  • 先输出左子树,然后输出当前节点10,最后输出右子树;
  • 对于其左子树来说,同样以这样的顺序,则先输出左子树4,然后输出节点值5,最后输出右子树8;
  • 对于其右子树,同样以这样的顺序,则先,输出左子树13,然后输出节点值19,最后输出右子树24;
  • 最终得到中序遍历输出为:4,5,8,10,13,19,24。

我们发现二叉查找树的中序遍历输出就是排序后的结果。还记得吗,二叉查找树也叫二叉搜索树或者二叉排序树。

中序遍历代码:

void 

后序遍历

  • 先输出左子树,然后输出右子树,最后输出节点值10
  • 对于其左子树来说,同样以这样的顺序,则先输出左子树4,然后输出右子树8,最后输出节点值5;
  • 对于其右子树,同样以这样的顺序,则先,输出左子树13,然后输出右子树24,最后输出节点值19
  • 最终得到后序遍历输出为:4,8,5,13,24,19,10

后序遍历代码:

void 

层次遍历

  • 遍历第一层,输出10
  • 遍历第二层,输出5,19
  • 遍历第三层,输出4,8,13,24

虽然看起来过程很简单,但是代码实现却不能像前面三种深度优先遍历方式那样直接使用递归,它更好的方式是借助一个具有先入先出特点的队列(队列可参考队列-C语言实现)。以三个节点为例,我们先将根节点入队,然后分别入队左右孩子节点,最后输出队列内容,那么它的顺序就是层次遍历的顺序了。

头结点入队:

10

输出,队头元素10,并将它的左右孩子5,19入队:

519

输出队头元素5,并将它的左右孩子4,8入队:

1948

输出队头元素19,并将它的左右孩子13,24入队:

481324

由于队列中的元素都没有孩子节点,因此都直接出队,输出4,8,13,24

最终得到的输出顺序为:10,5,19,4,8,13,24.

关键代码如下:

void 

完整可运行代码

完整代码较长,请访问:traversal.c
运行结果:

insert 10 to tree
insert 5 to tree
insert 19 to tree
insert 4 to tree
insert 8 to tree
insert 13 to tree
insert 24 to tree层次遍历:10 5 19 4 8 13 24
前序遍历:10 5 4 8 19 13 24
后序遍历:4 8 5 13 24 19 10
中序遍历:4 5 8 10 13 19 24

思考

前面三种遍历方式都是直接printf输出,如果需要遍历返回一个数组呢?该如何实现?难点在哪?

c++层次遍历_动画:二叉树遍历的多种姿势相关推荐

  1. 二叉树的建立与遍历_51、二叉树遍历-重建二叉树JZ4

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  2. c语言二叉树的遍历菜单系统,二叉树遍历C语言的实现

    广告 提供50多种云计算产品,包括云服务器和云. 创建一站式云产品试用服务,以帮助开发人员和企业以零门槛进入云环境. 上面的代码很简单,上面的图片很容易理解. 下一点是焦点: 二叉树的遍历分为前遍,中 ...

  3. 二叉树层序遍历_求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  4. 二叉树层级遍历_二叉树中的层级顺序遍历

    二叉树层级遍历 Level Order Traversal is one of the methods for traversing across a Binary Tree. In this art ...

  5. C#二叉树遍历算法实现浅析

    C#算法实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)进行C#二叉树遍历.希望能给有需要人带来帮助,也希望能得到大家的指点.有关C#数据结构的书在书店里找到, ...

  6. (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序)

    文章目录 一:二叉树遍历概述 二:二叉树深度优先遍历 (1)先序遍历-根左右(NLR) (2)中序遍历-左根右(LNR) (3)后序遍历-左右根(LRN) 总结:三种遍历方式动图演示 三:二叉树的层序 ...

  7. 树(二)——二叉树遍历

    目录  二叉树的遍历 一.二叉树的遍历 二.二叉树遍历的递归 1.两个例子便于理解三种遍历方式: 2.二叉树遍历的递归实现 三.二叉树遍历的非递归 1.二叉树遍历的非递归 2.三种遍历方式的非递归实现 ...

  8. 如何遍历一棵二叉树?

    二叉树的遍历分为三种:前序遍历 中序遍历 后序遍历 前序遍历:按照"根左右",先遍历根节点,再遍历左子树 ,再遍历右子树 中序遍历:按照"左根右",先遍历左子树 ...

  9. 一文搞懂二叉树遍历---超详解(二叉树逐步剖析二)

    大家好!这里是小张,上次我们说到了二叉树的存储结构,今天我们继续来说说二叉树的遍历,废话不多说,我们现在就开始! 另外有很多小伙伴们在学习算法的时候,只去学习一些关于算法理论的知识,并不知道自己的代码 ...

最新文章

  1. git 使用和一些错误
  2. 深度学习必懂的 13 种概率分布(附链接)
  3. 深入浅出理解c++虚函数
  4. Windows环境下利用VS和mingw编译LLVM
  5. 游戏在ios和android,陈情令手游ios和安卓互通吗 ios和安卓能一起玩吗
  6. JAVA编译时出现的错误提示
  7. tar (child): .tgz\r:无法 open: 没有那个文件或目录
  8. php ci框架 模板引擎,详解CodeIgniter框架实现的整合Smarty引擎DEMO
  9. 黑旋风简约引导页源码-个人官网必备
  10. c语言spi测试代码,C语言程序SPI
  11. oracle多列转换成树结构,如何将树“压缩”为Oracle中层次结构上的聚合数据?
  12. 坐标字符NYOJ 298 点的变换 (矩阵快速幂)
  13. UML建模工具最近更新汇总(-2022年7月)共16款:Visual State、UML Diagrammer……
  14. 应对CentOS 停服,麒麟信安迁移方案已就绪
  15. 计算机一些简单快捷键,最全的电脑常用快捷键大全 电脑快捷键使用大全
  16. 政务内网、政务外网、政务专网
  17. php 判断中文和英文,PHP如何判断中文还是英文?
  18. SLAM十四讲第三讲实践:useGeometry------小白强行读代码
  19. SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数)
  20. JavaScript用Math.asin()求反正弦值

热门文章

  1. apache phoenix 安装试用
  2. php程序中报date错误
  3. SQL Server 预读和物理读 的区别
  4. 前台后台进程转换问题
  5. fresco xml配置属性不起作用
  6. 关于css3的自定义字体
  7. VMware Workstation
  8. php比较函数,判断安全函数
  9. 田志刚:企业知识管理与用户创造内容(UGC)
  10. 安装numpy,setuptools的时候,不能再注册表中识别出来python2.7