在面试时,避免不了的会遇到一些数据结构的面试题,今天我们就来了解一下二叉树的经典面试题:

已知二叉树的前序遍历顺序为ABDCEGHF,中序遍历顺序为DBAGEHCF,求该二叉树的后序遍历。

还有:

已知二叉树的中序遍历顺序为DBAGEHCF,后序遍历顺序为DBGHEFCA,求该二叉树的前序遍历。

类似的面试题应该如何应对呢?

什么是二叉树?

在开始之前,容我再唠叨几句:什么是二叉树?二叉树(Binary Tree)是一种特殊的树,树上的每个结点最多有两个子树的树结构,也就是说每一个父结点最多长出两个树杈。通常两个子结点被称为左子结点和右子结点。比如:

其中,A就是整个二叉树的根结点,那么B就是A的左子结点,C就是A的右子结点。每一个结点,我们可以用Java语言这样实现:

/**
* 二叉树结点
*/
public class TreeNode {public char value;/*** 左子树*/public TreeNode left;/*** 右子树*/public TreeNode right;
}

三种遍历方式

在解题之前,先把前序遍历、中序遍历、后序遍历这三种遍历方式说清楚,为之后的解题打下良好的基础。

前序遍历

前序遍历就是,先访问结点,再访问子结点,再访问子结点。上图二叉树的前序遍历的顺序就是ABDCEGHF。我们可以用Java语言这样实现:

public void preOrder(TreeNode biTree) {System.out.println(biTree.value);if(biTree.left != null) {preOrder(biTree.left);}if(biTree.right != null) {preOrder(biTree.right);}
}

中序遍历

中序遍历就是,先访问子结点,再访问结点,再访问子结点。上图二叉树的中序遍历的顺序就是DBAGEHCF。我们可以用Java语言这样实现:

public void preOrder(TreeNode biTree) {if(biTree.left != null) {preOrder(biTree.left);}System.out.println(biTree.value);if(biTree.right != null) {preOrder(biTree.right);}
}

后序遍历

后序遍历就是,先访问子结点,再访问子结点,再访问结点。上图二叉树的后序遍历的顺序就是DBGHEFCA。我们可以用Java语言这样实现:

public void preOrder(TreeNode biTree) {if(biTree.left != null) {preOrder(biTree.left);}System.out.println(biTree.value);if(biTree.right != null) {preOrder(biTree.right);}
}

经过上面的叙述,可以总结出:前序遍历、中序遍历、后序遍历三种遍历中的“前”、“中”、“后”都是指根结点的访问顺序,“前”则是先访问根结点,“中”则是在左右中间访问根结点,,“后”则是最后访问根结点。

已知前中序遍历顺序,求后序遍历顺序

扯了这么多,还是回到刚刚的第一道面试题上:

已知二叉树的前序遍历顺序为ABDCEGHF,中序遍历顺序为DBAGEHCF,求该二叉树的后序遍历。

我们的解题思路是,先根据前中序遍历顺序重新构造出这个二叉树,再根据二叉树写出后序遍历顺序。

重构二叉树

前序遍历(ABDCEGHF)中的第一个结点A肯定为根结点,那么在中序遍历(DBAGEHCF)中,A结点的左边(DB)肯定为结点A的左子树,A结点的右边(GEHCF)肯定为结点A的右子树,初步判断二叉树是这样的:

再看A的左子树(DB),在前序遍历(ABDCEGHF)中,B在最前面,说明B为该子树的根结点,再看中序遍历(DBAGEHCF),B的左边(D)肯定为A的左子树,B的右边(无)肯定为A的右子树,初步判断二叉树是这样的:

再看A的右子树(GEHCF),在前序遍历(ABDCEGHF)中,C在最前面,说明C为该子树的根结点,再看中序遍历(DBAGEHCF),C的左边(GEH)肯定为C的左子树,C的右边(F)肯定为C的右子树,初步判断二叉树是这样的:

再看C的左子树(GEH),在前序遍历(ABDCEGHF)中,E在最前面,说明E为该子树的根结点,再看中序遍历(DBAGEHCF),E的左边(G)肯定为E的左子树,E的右边(H)肯定为E的右子树,可以最终判断出二叉树是这样的:

写出后序遍历顺序

这个步骤就比较容易了,根据二叉树得到的后序遍历顺序就是:DBGHEFCA

已知中后序遍历顺序,求前序遍历顺序

扯了这么多,还是回到刚刚的第一道面试题上:

已知二叉树的中序遍历顺序为DBAGEHCF,后序遍历顺序为DBGHEFCA,求该二叉树的前序遍历。

我们的解题思路是,先根据中后序遍历顺序重新构造出这个二叉树,再根据二叉树写出前序遍历顺序。

重构二叉树

后序遍历(DBGHEFCA)中的最后一个结点A肯定为根结点,那么在中序遍历(DBAGEHCF)中,A结点的左边(DB)肯定为结点A的左子树,A结点的右边(GEHCF)肯定为结点A的右子树,初步判断二叉树是这样的:

再看A的左子树(DB),在后序遍历(DBGHEFCA)中,B在最后面,说明B为该子树的根结点,再看中序遍历(DBAGEHCF),B的左边(D)肯定为A的左子树,B的右边(无)肯定为A的右子树,初步判断二叉树是这样的:

再看A的右子树(GEHCF),在后序遍历(DBGHEFCA)中,C在最后面,说明C为该子树的根结点,再看中序遍历(DBAGEHCF),C的左边(GEH)肯定为C的左子树,C的右边(F)肯定为C的右子树,初步判断二叉树是这样的:

再看C的左子树(GEH),在后序遍历(DBGHEFCA)中,E在最后面,说明E为该子树的根结点,再看中序遍历(DBAGEHCF),E的左边(G)肯定为E的左子树,E的右边(H)肯定为E的右子树,可以最终判断出二叉树是这样的:

写出前序遍历顺序

这个步骤就比较容易了,根据二叉树得到的前序遍历顺序就是:ABDCEGHF

文章持续更新,微信搜索「万猫学社」第一时间阅读。
关注后回复「电子书」,免费获取12本Java必读技术书籍。

二叉树面试题:前中序求后序、中后序求前序相关推荐

  1. 二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)

    二叉树的遍历(前序.中序.后序.已知前中序求后序.已知中后序求前序)   之前的一篇随笔(二叉树.前序遍历.中序遍历.后序遍历)只对二叉树的遍历进行了笼统的描述,这篇随笔重点对前.中.后序的遍历顺序进 ...

  2. 二叉树:已知先序和中序求后序,已知中序和后序求先序

    树的三种遍历方式的遍历顺序: 先序遍历:根.左子树.右子树(特点:第一个元素为根) 中序遍历:左子树.根.右子树(特点:根的两边分别为左子树和右子树) 后序遍历:左子树.右子树.根(特点:最后一个元素 ...

  3. python实现二叉树非递归前中后序遍历

    python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...

  4. 金证部分笔试题--前中后序、IP地址分类、三次握手、BIO,NIO,AIO等

    1.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是? 解题需要知道的知识点:前序中序和后序 (1)先看下面简单的二叉树 A:根节点,B:左子节点,C:右子节点 前序: ...

  5. 二叉树遍历方法——前、中、后序遍历(图解)

    目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...

  6. 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...

    后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...

  7. 给定二叉树的先序遍历和中序遍历,求其后序遍历(先中定序)

    题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: ...

  8. 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...

    本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作.分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历 输出:后续遍历 思想: 先序遍历中,第 ...

  9. 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是

    已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...

  10. 已知满二叉树先序序列存在于数组中,设计算法将其变成后序序列

    解题思路: 满二叉树:除最后一层无任何子结点外,每一层上的所有结点都有两个以上的结点 先序序列:DLR 后序序列:LRD 先从最简单的满二叉树开始: 1.只有一个结点的满二叉树 2.有三个结点的满二叉 ...

最新文章

  1. Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別
  2. 启用tomcat debug模式
  3. 计算机专业人士读好书(30本经典)
  4. 【自动驾驶】9.分布式通信技术之发布订阅,干货满满
  5. PAT甲级 -- 1050 String Subtraction (20 分)
  6. .net 将html写成的table 转换成excel_Python读取二进制,HTML,XML格式存储Excel
  7. C# winform 窗体接收命令行参数自动登录进行系统,模拟600个WCF客户端的并发压力测试...
  8. 算法训练营 重编码_编码训练营后十四天如何找到工作
  9. 利用Python进行「基金投资组合优化」(一)
  10. 小米集团:副董事长林斌承诺5年内不出售公司股份 已作安排的除外
  11. 比特币在推特上的活跃度正接近2017年水平
  12. 听阿里P8聊完这个 SpringBoot 的项目,瞬间觉得自己白学了…
  13. 一级计算机考试如何移动文件夹,2010年职称计算机考试:文件或文件夹的移动...
  14. 【Pygame实战】这游戏有毒,刷爆朋友圈:小编已与病毒版贪吃蛇大战了三百回合,最高分339?
  15. Markdown空两格,图片居中
  16. 笔记本合上盖子怎么不休眠了?
  17. css3 如何画太极 和 奥运五环
  18. photoshopcs6破解补丁用来干嘛的
  19. 白话理解java多线程之setDaemon()方法
  20. Windows10系统CUDA和CUDNN安装教程

热门文章

  1. 我眼中的工程师的十个特质
  2. 你知不知道,天空没有想象中蓝
  3. 线程池自定义拒绝策略
  4. 小米5 原生android 7.0,发烧米粉看过来!小米5官方版Android 7.0来袭
  5. 立创开源 BGA221芯片开发
  6. 从根儿上理解虚拟内存
  7. 【PBR系列六】基于物理的环境光照(上):漫反射辐照度(Diffuse irradiance)
  8. 利用核辐照,医用防护服灭菌耗时从两周缩短到一天
  9. 穿戴式心电信号采集系统设计(任务书+lunwen+答辩PPt+查重报告)
  10. 建立student类,在此类中所有数据定义为私有数据变量。并建立一个student对象数组,用附件中的数据进行初始化。计算每个学生三门课程的总分和平均成绩(C++实验)