二叉树面试题:前中序求后序、中后序求前序
在面试时,避免不了的会遇到一些数据结构的面试题,今天我们就来了解一下二叉树的经典面试题:
已知二叉树的前序遍历顺序为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必读技术书籍。
二叉树面试题:前中序求后序、中后序求前序相关推荐
- 二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)
二叉树的遍历(前序.中序.后序.已知前中序求后序.已知中后序求前序) 之前的一篇随笔(二叉树.前序遍历.中序遍历.后序遍历)只对二叉树的遍历进行了笼统的描述,这篇随笔重点对前.中.后序的遍历顺序进 ...
- 二叉树:已知先序和中序求后序,已知中序和后序求先序
树的三种遍历方式的遍历顺序: 先序遍历:根.左子树.右子树(特点:第一个元素为根) 中序遍历:左子树.根.右子树(特点:根的两边分别为左子树和右子树) 后序遍历:左子树.右子树.根(特点:最后一个元素 ...
- python实现二叉树非递归前中后序遍历
python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...
- 金证部分笔试题--前中后序、IP地址分类、三次握手、BIO,NIO,AIO等
1.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是? 解题需要知道的知识点:前序中序和后序 (1)先看下面简单的二叉树 A:根节点,B:左子节点,C:右子节点 前序: ...
- 二叉树遍历方法——前、中、后序遍历(图解)
目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...
- 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...
后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...
- 给定二叉树的先序遍历和中序遍历,求其后序遍历(先中定序)
题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: ...
- 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...
本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作.分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历 输出:后续遍历 思想: 先序遍历中,第 ...
- 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是
已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...
- 已知满二叉树先序序列存在于数组中,设计算法将其变成后序序列
解题思路: 满二叉树:除最后一层无任何子结点外,每一层上的所有结点都有两个以上的结点 先序序列:DLR 后序序列:LRD 先从最简单的满二叉树开始: 1.只有一个结点的满二叉树 2.有三个结点的满二叉 ...
最新文章
- Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別
- 启用tomcat debug模式
- 计算机专业人士读好书(30本经典)
- 【自动驾驶】9.分布式通信技术之发布订阅,干货满满
- PAT甲级 -- 1050 String Subtraction (20 分)
- .net 将html写成的table 转换成excel_Python读取二进制,HTML,XML格式存储Excel
- C# winform 窗体接收命令行参数自动登录进行系统,模拟600个WCF客户端的并发压力测试...
- 算法训练营 重编码_编码训练营后十四天如何找到工作
- 利用Python进行「基金投资组合优化」(一)
- 小米集团:副董事长林斌承诺5年内不出售公司股份 已作安排的除外
- 比特币在推特上的活跃度正接近2017年水平
- 听阿里P8聊完这个 SpringBoot 的项目,瞬间觉得自己白学了…
- 一级计算机考试如何移动文件夹,2010年职称计算机考试:文件或文件夹的移动...
- 【Pygame实战】这游戏有毒,刷爆朋友圈:小编已与病毒版贪吃蛇大战了三百回合,最高分339?
- Markdown空两格,图片居中
- 笔记本合上盖子怎么不休眠了?
- css3 如何画太极 和 奥运五环
- photoshopcs6破解补丁用来干嘛的
- 白话理解java多线程之setDaemon()方法
- Windows10系统CUDA和CUDNN安装教程
热门文章
- 我眼中的工程师的十个特质
- 你知不知道,天空没有想象中蓝
- 线程池自定义拒绝策略
- 小米5 原生android 7.0,发烧米粉看过来!小米5官方版Android 7.0来袭
- 立创开源 BGA221芯片开发
- 从根儿上理解虚拟内存
- 【PBR系列六】基于物理的环境光照(上):漫反射辐照度(Diffuse irradiance)
- 利用核辐照,医用防护服灭菌耗时从两周缩短到一天
- 穿戴式心电信号采集系统设计(任务书+lunwen+答辩PPt+查重报告)
- 建立student类,在此类中所有数据定义为私有数据变量。并建立一个student对象数组,用附件中的数据进行初始化。计算每个学生三门课程的总分和平均成绩(C++实验)