这道题目很经典,具体如下:

已知遍历结果如下,试画出对应的二叉树:

前序: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/的更多相关文章

  1. 【风马一族_Java】使用java,画出任意大小的菱形

    public class rhombic { public static void main(String[] args){ /** * scriber()画菱形的方法,参数 9 是指菱形的对角线的长 ...

  2. 二叉树的遍历(递归,迭代,Morris遍历)

    二叉树的遍历: 先序,中序,后序: 二叉树的遍历有三种常见的方法, 最简单的实现就是递归调用, 另外就是飞递归的迭代调用, 最后还有O(1)空间的morris遍历: 二叉树的结构定义: struct ...

  3. lintcode.66 二叉树前序遍历

    二叉树的前序遍历    描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返 ...

  4. c语言贪吃蛇详解-2.画出蛇

    c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...

  5. c语言贪吃蛇详解1.画出地图

    c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...

  6. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  7. 二叉树的遍历--C#程序举例二叉树的遍历

    二叉树的遍历--C#程序举例二叉树的遍历 关于二叉树的介绍笨男孩前面写过一篇博客 二叉树的简单介绍以及二叉树的存储结构 遍历方案 二叉树的遍历分为以下三种: 先序遍历:遍历顺序规则为[根左右] 中序遍 ...

  8. 数据结构与算法之PHP实现二叉树的遍历

    一.二叉树的遍历 以某种特定顺序访问树中所有的节点称为树的遍历,遍历二叉树可分深度优先遍历和广度优先遍历. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.可以细分 ...

  9. python文本挖掘输出权重,词频等信息,画出3d权重图

    # -*- coding: utf-8 -*- from pandas import read_csv import numpy as np from sklearn.datasets.base im ...

随机推荐

  1. [ NOIP2013 D2-T3 ] 华容道

    NOIP2013 华容道 图论好题. 介于网上全是些令蒟蒻头昏的题解和排版一塌糊涂以及过于详细的题解...蒟蒻记录一下.. 显然需要将白格移动到 \(s\) 相邻格,然后交换 \(s\) 与白格,再将 ...

  2. C语言零基础入门难发愁,那就快来看看这篇基础整理资料吧

    C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { in ...

  3. VirtualBox Share Folder

    转载:https://www.cnblogs.com/Dennis-mi/articles/5896586.html 使用virtualbox最方便的host-guest交换文件方案莫过于共享文件夹功 ...

  4. Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间 (转载)

    在windows下,一个文件有:创建时间.修改时间.访问时间. 而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就 ...

  5. cf13C Sequence(DP)

    题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...

  6. 批量免密ssh

    参考连接:https://www.cnblogs.com/xiaoyuxixi/p/11413355.html 适用于所有密码都一样的情况下 应用场景: 在应用ansible的实际情况中,有一个很现实 ...

  7. vue-router 4 你真的熟练吗?

    虽然 vue-router 4 大多数 API 保持不变,但是在 vue3 中以插件形式存在,所以在使用时有一定的变化.接下来就学习学习它是如何使用的. 一.安装并创建实例 安装最新版本的 vue-r ...

  8. Linux 守护进程原理及实例(Redis、Nginx)

    1. 什么是守护进程 守护进程daemon,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束.可以使用命令ps -axj查看系统的守护进程,输出如下所示: 父ID PID 组I ...

  9. httprunner3源码解读(4)parser.py

    源码结构目录 可以看到此模块定义了4个属性和12个函数,我们依次来讲解 属性源码分析 # 匹配http://或https:// absolute_http_url_regexp = re.compil ...

  10. 合并代码操作 | git fetch 与 git pull

    前言 首先我们要说简单说git的运行机制.git分为本地仓库和远程仓库,我们一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程 ...