前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构——遍历二叉树

数据结构——遍历二叉树

作者头像
蜻蜓队长
发布2018-08-03 10:28:57
4130
发布2018-08-03 10:28:57
举报
二叉树遍历原理

二叉树的遍历:是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。

这里有两个关键词:访问和次序。

访问其实是要根据实际的需要来确定具体做什么,比如对每个结点进行相关计算,输出打印等。它算作是一个抽象操作。

二叉树的遍历次序不同于线性结构,最多也就是从头到尾、循环和双向等简单的遍历方式。树的结点之间不存在唯一的前驱和后继关系,在访问一个结点后,下一个被访问的结点面临着不同的选择。

二叉树遍历方法

二叉树的遍历方式可以有很多,如果我们限制从左到右的顺序,就主要分为四种:

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历
  4. 层序遍历
1、前序遍历

若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如下图遍历顺序为:ABDGHCEIF。

2、中序遍历

若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点左子树,然后访问根结点,最后中序遍历右子树,如下图遍历顺序为:GDHBAEICF。

3、后序遍历

若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点,如下图遍历顺序为:GHDBIEFCA。

4、层序遍历

若二叉树为空,则空操作返回,否则从树的第一层开始,也就是从根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问,如下图遍历顺序为:ABCDEFGHI。

我们提到的四种遍历方式,其实都是在把树种的结点编程某种意义上的线性序列,这样给程序执行带来了好处。

层序遍历很好理解,就是逐层遍历,每层从左到右逐个遍历;前序、中序、后序遍历最根本的区别就是双亲结点的访问时机:前序是先访问双亲结点,然后左孩子,最后右孩子;中序是左孩子,双亲,右孩子;后序是左孩子、右孩子最后双亲结点。

树的定义就使用了递归这一方式,当然,对树的遍历也是使用递归(注意递归算法一定要有结束递归的标志),关于二叉树遍历的算法,就不再详细描述了。

推导遍历结果

有一种题目是为了考察你对二叉树遍历的掌握程度,会这样出题:已知一棵二叉树的前序遍历顺序是ABCDEF,中序遍历顺序是CBAEDF,请问这棵树的后序遍历是什么?

对于这样的题目,如果真正了解各种遍历规则,其实是不难的。

三种遍历都是从根结点开始,前序遍历是先打印再递归左和右,所有前序遍历序列为ABCDEF,第一个字母A就是根结点;再由中序遍历序列CBAEDF,可以只带C和B是A的左子树上的结点,E、D、F是A的右子树上的结点,我们可以得到以下这样的图:

然后再看前序序列中的C和B,先B再C,所以B应该是A的左孩子,C就只能说B的孩子了,至于C是B的左还是右孩子,再看中序序列CBAEDF,C在B之前打印,说明C是B的左孩子,如图:

再看前序中的E、D、F,他们的顺序是ABCDEF,意味着D是A的右孩子,E和F是D的子孙(注意,他们中有一个不一定是孩子,还可能是孙子)。再看中序序列是CBAEDF,E在D的左侧,F在右侧,所以E是D的左孩子,F是D的右孩子,如图:

为了避免推导失误,我们最好自己再按此树推导一遍前序和中序遍历序列。根据二叉树结构图,轻松得到后序遍历为CBEFDA。

这里我们可以得到两个二叉树遍历的性质:

  1. 已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树;
  2. 已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树;

注意:已知前序和后序遍历,是不能确定一棵二叉树的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android机动车 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二叉树遍历方法
    • 1、前序遍历
      • 2、中序遍历
        • 3、后序遍历
          • 4、层序遍历
          • 推导遍历结果
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档