二叉树的先序,中序,后序如何遍历,不在此多说了。直接看题目描述吧(题目摘自九度oj剑指offer面试题6):

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。

输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。

输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列

输出

对应每个测试案例,输出一行:

如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。

如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。

下面看一下解题思路:

二叉树的问题,我们首先想到递归思想,即大问题的解题思路和小问题的解决思路是一样的。先来分析二叉树的先序和中序遍历序列能给我们哪些有用的信息,首先先序遍历可以告诉我们二叉树的根节点(即先序遍历序列的第一个元素)。其次,我们可以通过查询得到二叉树的根节点在中序遍历序列中的位置(假设为L),那么中序遍历序列L之前的是左子树,之后的右子树。知道这两部分信息之后,我们在考虑后序遍历,对于一个二叉树来说,根节点是后序遍历的最后一个去遍历的节点。

经过以上分析,我们就可以这样解题了(如下图):

现在要考虑的是,先递归右子树还是左子树,因为后序遍历是先左后右,而我们现在是从后往前得到后序遍历序列,所以先递归右子树。还有一个问题,即什么时候不能构成二叉树,本人以为只要根节点在中序遍历序列中查找不到就不能构成二叉树。

题目就分析到这,下面给出C语言完整代码,在九度oj上已AC,代码如下:

#include<stdio.h>
#include<stdlib.h>
/*
*已知二叉树的先序和中序遍历,求后序遍历
*/
int pos[1000];
int n;
int flag=0;
int locationInMid(int mid[],int ms,int me,int h)
{  int i;  for(i=ms;i<=me;++i)  {  if(mid[i]==h)  return i;  }  return -1;
}
void postOrder(int pre[],int ps,int pe,int mid[],int ms,int me) //有待改进的地方,函数的参数可以简化,因为数组的地址是0号元素的地址,知道头结点在mid中的位置后,左右子树的个数即可得到
{  int hm=0,cl=0,cr=0;  pos[--n]=pre[ps];  //--n;  hm=locationInMid(mid,ms,me,pre[ps]);  if(hm==-1)  {  //  printf("No\n");  flag=-1;  return ;  }  else  {  cl=hm-ms;  cr=me-hm;  if(cr>0)  postOrder(pre,ps+cl+1,pe,mid,hm+1,me);  if(cl>0)  postOrder(pre,ps+1,ps+cl,mid,ms,hm-1);  }  return ;
}
int  main()
{  int pre[1000];  int mid[1000];  int i,t;  while(scanf("%d",&n)!=EOF)  {  t=n;  for(i=0;i<n;++i)  scanf("%d",&pre[i]);  for(i=0;i<n;++i)  scanf("%d",&mid[i]);  postOrder(pre,0,n-1,mid,0,n-1);  if(flag==-1)  {  printf("No\n");  flag=0;  }  else  {  for(i=0;i<t;++i)//注意:n是全局变量所以上一个语句执行完之后,n的值已经不是原来的n了,所以要用t保存n最初的值   printf("%d ",pos[i]);  printf("\n");  }  }  return 0;
}  

本题的代码并不是最简洁的,但最容易理解,其实ps,pe,ms,me四个变量并不完全需要,因为pre指向的pre[ps],而知道二叉树的节点个数和根节点在中序遍历中的位置即可求得左右子树的位置,大家可以思考一下,优化一下代码。

转载于:https://www.cnblogs.com/yzm10/p/7237102.html

剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历相关推荐

  1. 剑指offer——面试题58:二叉树的下一个结点

    剑指offer--面试题58:二叉树的下一个结点 这个题要认真分析一下... Solution1: 自己想出来的破算法 /* struct TreeLinkNode {int val;struct T ...

  2. 剑指offer——面试题39:二叉树的深度

    剑指offer--面试题39:二叉树的深度 20180906整理 Solution1: 再本题中树的定义:若二叉树只有一个根节点,则此二叉树的深度为1. 迭代法,哈哈哈 /* struct TreeN ...

  3. 【重点】剑指offer——面试题25:二叉树中和为某一值的路径

    剑指offer--面试题25:二叉树中和为某一值的路径 参考网址:https://www.nowcoder.com/profile/5488508/codeBookDetail?submissionI ...

  4. 【递归】剑指offer——面试题19:二叉树的镜像

    剑指offer--面试题19:二叉树的镜像 Solution1: 递归解法,牢记! 根结点为空的情况容易漏,注意! /* struct TreeNode {int val;struct TreeNod ...

  5. 剑指offer——面试题32:从1到n整数中1出现的次数

    剑指offer--面试题32:从1到n整数中1出现的次数 Solution1: 最容易想到的方法: class Solution { public:int NumberOf1Between1AndN_ ...

  6. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 1 package com.xsf.Sor ...

  7. 剑指Offer - 面试题7. 重建二叉树(递归)

    1. 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍 ...

  8. 剑指offer面试题[6]-重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  9. 剑指offer面试题07. 重建二叉树(递归)(切片)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 思路 详见链接 代码 #class TreeNode: # def __ini ...

  10. [剑指offer]面试题19:二叉树的镜像

    面试题19:二叉树的镜像 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. 二叉树结点的定义如下: struct BinaryTreeNode {int value;BinaryTreeNo ...

最新文章

  1. 1号店交易系统架构如何向「高并发高可用」演进
  2. Java的calendar类用法
  3. 解扰matlab,数据序列扰乱与解扰MATLAB实现及性能分析—利用m序列.doc
  4. 【Windows】关于shift和空格同时按无反应的解决方案
  5. 首款搭载鸿蒙OS的智能手机,首款搭载鸿蒙OS 华为智选智能摄像头Pro零点全网开售:299元...
  6. 45岁,从中医转行云计算,年薪近百万...
  7. list each详解
  8. [转]如何才能在 IIS 7.5 使用 Windows PowerShell Snap-In 功能
  9. 华为或向苹果出售 5G 芯片;拼多多回应苹果停止供货;微信再推新功能! | 极客头条...
  10. 都在这儿了!Flink Forward Asia 最佳参会指南
  11. Delphi中Hash表的使用方法!
  12. c语言面试题集,c语言面试题集经典
  13. Qt实践2: 简易计算器
  14. 简单脱壳教程笔记(4)---手脱ASPACK壳
  15. 【C++】gflags的使用
  16. 【报告分享】快手私域经营白皮书-磁力引擎(附下载)
  17. 跟宁哥学Go语言视频课程(10):反射-李宁-专题视频课程
  18. 鸿蒙内核手机,华为和安卓说再见,推出鸿蒙内核手机,不再更新安卓
  19. iPhone苹果手机语音备忘录M4A文件损坏显示时长无法播放修复方法
  20. 360众测重装上阵,创新服务模式重塑众测新业态

热门文章

  1. 没有找到dllregisterserver输入点_「Mac实用技巧」将浏览器的点密码转换成文本密码的三种方法分享...
  2. mysql ibd文件还原_MySQL
  3. python numpy array最大长度_python中找出numpy array数组的最值及其索引方法
  4. 原生js实现form表单序列化
  5. Car2go 的前端框架选择
  6. Salt: 2015.8.8.2 L@匹配BUG
  7. javascript的getElementByTagName
  8. OGRE: OgreOverlaySystem.h: No such file or directory
  9. struts的体系结构
  10. MySQL 5.5/5.6——概述 MySQL 客户端程序