二叉树——根据遍历结果,画出对应的二叉树 转载至:http://canlynet.blog.163.com/blog/static/255013652009112602449178/
这道题目很经典,具体如下:
已知遍历结果如下,试画出对应的二叉树:
前序:A B C E H F I J D G K
中序:A H E C I F J B D K G
解题要点:
1、前序、中序、后序——都针对中间那个节点而言(根节点也是中间的节点)。
前序,指先遍历中间节点,然后左,然后右。
中序,指左——中——右。
后序,指右——中——左。
2、根据两种不同序列的遍历方法,便可画出二叉树。
解题答案如下:(对照着看会好理解这道题目一些的)

解题思路:
1、前序中序都首先找出A,推断出:A没有左孩子(否则中序要先遍历其左孩子)。A为根节点(前序先遍历中节点)。
2、A没有左孩子,一定就只有右孩子了(否则哪来那么多后面的字符)。右孩子一定是B,根据前序结果(前序先遍历中节点)。
3、中序的第二个不是B,说明B一定有左孩子(中序先遍历左孩子)。既然有左孩子,那么在前序的B后面那位一定是啦——C,C有左孩子吗?一定有,否则中序的A后面就跟C啦。那么前序的C后面的E一定是C的左孩子(还是深入讲一下:前序是先遍历左,但左还有左的时候,得先遍历左的左,一直深入下去,找到最终的那个左节点,这个一定要明白,否则此题无法解开)。
4、同理:E也有左孩子,就是前序的E后面那位:H!好,既然中序的A后面是H,H一定没有左孩子啦。
5、下面怎么办呢?前序:H后面是F,中序:H后面的E、C已经确定了位置了,再后面是I,怎么办?
6、注意:中序H后面是E,说明H没有右孩子啊!(中序遍历方法!!)同理,E后面是C说明E也没有右孩子,C后面呢,是B吗?如果是,那么C也没有,惊喜了吧,中序当中C后面是I,说明C有右孩子,是谁呢?
7、既然C后面有右孩子,那么在前序中H后面的F一定就是我们要找的右孩子啦(因为前序是找中节点,然后找左孩子,左孩子中又先找中间节点,再找左孩子的左孩子……中——左——右,嵌套思想)。
8、F确定好位置后,那么考虑F有左孩子吗?如果没有,中序的C后面应该跟F,但是中序的C后面跟I,说明F有左节点,那么前序找完F一定要找到这个左节点了,就是说前序的F后面的I一定是F的左节点。
9、I有左孩子吗?中序的C后面跟的是I,说明I就是最终的左孩子了。
10、F有右孩子吗?如果没有,中序I的下一位应该是B,可是并非,所以它有右孩子,那么前序的I后面的J一定是这个右孩子。
11、J有左孩子吗?如果有,中序的F后面不能是J,可是并非如此,所以没有了。J有右孩子吗?如果有,中序的已经找过J啦,下一位就是找右孩子,所以看中序的J后面那一位,发现是B,B不是已经确定好位置了吗,所以啊,没有啦。回到B节点了。
12、前序的J后面的D一定就是B的右孩子(因为回到B了嘛,前序要先把B的右孩子当中节点找到,再去找右孩子的左孩子,再把左孩子当中节点找到……嵌套啊)。
13、D有左孩子吗?如果有,中序的B后面就不可能是D(因为中序要先找到最最最最最左边的那个啊)。所以没有。既然没有,那么前序就要找D的右孩子啦,那就是前序的D后面那个G。
14、G有左孩子吗?如果没有的话,中序的D后面一定是G啦,可是不是,所以它有左孩子,这个左孩子就是前序在找到G后面该找到的那位了,就是K。
OK,二叉树的图画出来了。
总结二叉树查找关键点:
1、每次都要假设,假设了立即推翻,如果假设有,发现不能成立的话,就推翻了这个假设,即确定了一个节点的存在与否。
2、一定要明白前序、中序、后序的遍历方法,要透彻的领悟到嵌套的思想,比如找左孩子,结果找到的左孩子还有左孩子,那么要先找左孩子的左孩子,如果左孩子的左孩子还有左孩子,那么……以此类推。
3、假设一定就一次,便可深入,否则就带有一定的猜测,然后证实的成分了,容易晕掉。
4、每次确定好一个位置都是100%确定的,所以画出来,不要犹豫,然后在前序、中序上做相应标记,知道自己下一个该确定那个字符的位置了。
5、解这个题目,一定不能着急,心要稳,别深入,没有更好的深入的方法(我没找到而已,哈哈)。每次找到一个节点就直接问,他有左孩子吗?如果有,那么在中序的查找中一定就该找他了,结果发现不是,所以推翻。如果没有,那么在前序一定就该找到这个节点了。方法就这一个而已,可以解开题目。
6、这个方法对后序查找也生效。
二叉树——根据遍历结果,画出对应的二叉树 转载至:http://canlynet.blog.163.com/blog/static/255013652009112602449178/的更多相关文章
- 【风马一族_Java】使用java,画出任意大小的菱形
public class rhombic { public static void main(String[] args){ /** * scriber()画菱形的方法,参数 9 是指菱形的对角线的长 ...
- 二叉树的遍历(递归,迭代,Morris遍历)
二叉树的遍历: 先序,中序,后序: 二叉树的遍历有三种常见的方法, 最简单的实现就是递归调用, 另外就是飞递归的迭代调用, 最后还有O(1)空间的morris遍历: 二叉树的结构定义: struct ...
- lintcode.66 二叉树前序遍历
二叉树的前序遍历 描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返 ...
- c语言贪吃蛇详解-2.画出蛇
c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)
前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...
- 二叉树的遍历--C#程序举例二叉树的遍历
二叉树的遍历--C#程序举例二叉树的遍历 关于二叉树的介绍笨男孩前面写过一篇博客 二叉树的简单介绍以及二叉树的存储结构 遍历方案 二叉树的遍历分为以下三种: 先序遍历:遍历顺序规则为[根左右] 中序遍 ...
- 数据结构与算法之PHP实现二叉树的遍历
一.二叉树的遍历 以某种特定顺序访问树中所有的节点称为树的遍历,遍历二叉树可分深度优先遍历和广度优先遍历. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.可以细分 ...
- python文本挖掘输出权重,词频等信息,画出3d权重图
# -*- coding: utf-8 -*- from pandas import read_csv import numpy as np from sklearn.datasets.base im ...
随机推荐
- the Agiles Scrum Meeting 11
会议时间:2020.4.20 20:00 1.每个人的工作 在这次例会上,我们对上周完成的工作进行了总结. 本周已完成的工作 个人结对项目增量开发组 tq: 创建广播功能 修复纯英文数字可能溢出bug ...
- SpringCloud微服务实战——搭建企业级开发框架(十):使用Nacos分布式配置中心
随着业务的发展.微服务架构的升级,服务的数量.程序的配置日益增多(各种微服务.各种服务器地址.各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求: 安全性:配置跟随源代码保 ...
- Springboot第一次访问慢,自身缺陷问题?
一.现象: 1.访问controller,第一次速度在300-400ms,第二次访问就很快了大概在20ms,相差几十倍,是哪里出了问题,尝试了网上很多教程都没有作用 如启动参数设置 -Djava.se ...
- webRTC中语音降噪模块ANS细节详解(三)
上篇(webRTC中语音降噪模块ANS细节详解(二))讲了ANS的处理流程和语音在时域和频域的相互转换.本篇开始讲语音降噪的核心部分,首先讲噪声的初始估计以及基于估计出来的噪声算先验信噪比和后验信噪比 ...
- 一步一步学ROP之linux_x64篇(蒸米spark)
目录 一步一步学ROP之linux_x64篇(蒸米spark) 0x00 序 0x01 Memory Leak & DynELF - 在不获取目标libc.so的情况下进行ROP攻击 0x02 ...
- ESXi 6.7 的https服务挂掉处理方法 503 Service Unavailable
首先进入EXSi开启SSH(ESXi的主机控制台,非web控制台,是安装esxi的控制台) 然后 /etc/init.d/hostd status 显示已停止, 使用 /etc/init.d/host ...
- Ubuntu中python的mysql操作
1.在已经安装了python和MySQL数据库的前提下使用pip3 install PyMySQL命令 2. 建立链接: (1)首先使用命令python 进入编程模式,再导入包: import pym ...
- Java学习(十六)
今天先学了文本标签 <p> <strong>永远不要相信诺克萨斯人的血条!</strong><!--表示一段内容的重要性--> <br /> ...
- 第三周PTA笔记 回文数+A-B(大数减法)+高精度除法+数楼梯(大数加法)
回文数 对于一个自然数n,若将n的各位数字反向排列所得的数n1与n相等,则称n为回文数,例如2332. 若给定一个N( 2<=N<=16)进制数M(M的长度在一百位以内),如果M不是回文数 ...
- cmd 命令 导出导入oracle数据库 的 表
原地址:https://www.cnblogs.com/mysterious-killer/p/11671741.html (防止) 导出: 不要数据的:exp username/pwd@localh ...