题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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”。

样例输入:

  1.  

样例输出:

  1. No

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. int findRoot(int *arr1,int begin1,int end1,int *arr2,int begin2,int end2,int *final);
  5. int final[];
  6. int flag = ;
  7. int main(void){
  8. int n,i;
  9. int arr1[];
  10. int arr2[];
  11. while(scanf("%d",&n) != EOF && n <= && n >= ){
  12. //initialize
  13. memset(arr1,,sizeof(int)*);
  14. memset(arr2,,sizeof(int)*);
  15. memset(final,,sizeof(int)*);
  16. flag = ;
  17. //input
  18. for(i=;i<n;i++)
  19. scanf("%d",&arr1[i]);
  20. for(i=;i<n;i++)
  21. scanf("%d",&arr2[i]);
  22.  
  23. if(findRoot(arr1,,n-,arr2,,n-,final) == )
  24. printf("No\n");
  25. else{
  26. for(i=flag+;i<;i++)
  27. printf("%d ",final[i]);
  28. printf("\n");
  29. }
  30. }
  31. return ;
  32. }
  33. int findRoot(int *arr1,int begin1,int end1,int *arr2,int begin2,int end2,int *final){
  34. int i,j;
  35. int sum = ;
  36. if(begin1==end1 && begin2 == end2){
  37. final[flag] = arr1[begin1];
  38. flag--;
  39. return ;
  40. }
  41. for(i=begin1 ; i<=end1;i++){
  42. for(j=begin2 ; j <=end2 ; j++){
  43. if(arr1[i] == arr2[j])
  44. sum++;
  45. }
  46. }
  47. if(sum != (end1-begin1+) && sum != (end2 - begin2+)){
  48. return ;
  49. }
  50.  
  51. final[flag] = arr1[begin1];
  52. flag--;
  53.  
  54. int numberofRoot = -;
  55. for(i=begin2 ; i<=end2 ; i++){
  56. if(arr1[begin1] == arr2[i]){
  57. numberofRoot = i;
  58. //printf("找到跟在arr2的坐标为%d\n",numberofRoot);
  59. break;
  60. }
  61. }
  62. if(numberofRoot != end2){
  63. //printf("right %d %d %d %d\n",begin1+numberofRoot-begin2+1,end1,numberofRoot+1,end2);
  64. if(!findRoot(arr1,begin1+numberofRoot-begin2+,end1,arr2,numberofRoot+,end2,final)){
  65. return ;
  66. }
  67. }
  68. if(numberofRoot != begin2){
  69. //printf("left %d %d %d %d\n",begin1+1,begin1+numberofRoot-begin2,begin2,numberofRoot-1);
  70. if(!findRoot(arr1,begin1+,begin1+numberofRoot-begin2,arr2,begin2,numberofRoot-,final)){//左子树
  71. return ;
  72. }
  73. }
  74. return ;
  75. }

剑指OFFER之重建二叉树(九度OJ1385)的更多相关文章

  1. 【剑指Offer面试题】 九度OJ1385:重建二叉树

    题目链接地址: pid=1385">http://ac.jobdu.com/problem.php?pid=1385 题目1385:重建二叉树 时间限制:1 秒内存限制:32 兆特殊判 ...

  2. 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...

  3. 【剑指Offer面试题】 九度OJ1389:变态跳楼梯

    转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...

  4. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

  5. 剑指Offer:重建二叉树【7】

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

  6. 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点

    鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...

  7. 【剑指Offer面试题】 九度OJ1371:最小的K个数

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...

  8. 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...

  9. 【剑指Offer面试题】九度OJ1384:二维数组中的查找

    下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...

  10. 《剑指offer》重建二叉树

    本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...

随机推荐

  1. POJ 3469 Dual Core CPU (最小割建模)

    题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...

  2. POJ 1833 排列

    题意: 给你某个排列 求从下一个排列开始的第k个排列如果是最后一个排列 则下一个排列为1 2 3 ... n// 1 用stl 里面的 next_permutation// 2 用生成下一个排列算法/ ...

  3. 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题

    [题目链接:NYOJ-82] #include<iostream> #include<cstring> using namespace std; struct node{ in ...

  4. Centos6.5下编译安装ACE6.0

    ACE在Linux下的编译安装步骤(CentOS6.5 64Bit) Linux平台安装(CentOS6.5 64bit) 1, 下载ACE软件包,上传至Linux服务器(假设目录为/opt/ace, ...

  5. java中判断是否为中文

    public boolean isChinese(String strName) { char[] ch = strName.toCharArray(); for (int i = 0; i < ...

  6. 【Android】以BaseAdapter做适配器的ListView及其性能优化

    适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...

  7. jQuery常用的正则表达式

    [导读] 本文章提供了大量的jQuery正则表达式,有电话号码,密码,用户名,邮箱,哈能输入字符等,有需要的朋友可以参考一下. 代码如下复制代码 <!DOCTYPE html PUBLIC &q ...

  8. Linux基本命令(2)有关磁盘空间的命令

    有关磁盘空间的命令 命令 功能 mount 挂载文件系统 umount 卸载已挂载上的文件系统 df 检查各个硬盘分区和已挂上来的文件系统的磁盘空间 du 显示文件目录和大小 fsck 主要是检查和修 ...

  9. Jacoco远程统计代码覆盖率

    Jacoco   什么是Jacoco? Jacoco是一个开源的Java代码覆盖率工具,Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAg ...

  10. qt 在指定区域添加图片

    博客出处:http://www.devdiv.com/thread-39111-1-1.html 折腾了几天,终于实现了图片的淡出淡入的效果. 其实也应该是说实现了图片的淡入效果,因为淡出效果我暂时还 ...