剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385

题目描写叙述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。如果输入的前序遍历和中序遍历的结果中都不含反复的数字。

比如输入前序遍历序列{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. 8
  1. 1 2 4 7 3 5 6 8 
  1. 4 7 2 1 5 3 8 6
  1. 8
  1. 1 2 4 7 3 5 6 8
  1. 4 1 2 7 5 3 8 6
例子输出:
  1. 7 4 2 5 8 6 3 1 No

这个题用递归来重建二叉树,详细代码例如以下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define SIZE 1001
  5.  
  6. typedef struct STreeNode
  7. {
  8. int data;
  9. struct STreeNode *left;
  10. struct STreeNode *right;
  11. }STreeNode;
  12.  
  13. int ArrPre[SIZE];
  14. int ArrMid[SIZE];
  15. int CanBuild;
  16.  
  17. int getMidPos(int vKey, int vStart, int vEnd)
  18. {
  19. int i;
  20. for (i = vStart; i < vEnd; ++i)
  21. {
  22. if (ArrMid[i] == vKey) return i;
  23. }
  24. return -1;
  25. }
  26.  
  27. void createNode(STreeNode **vNode, int vData)
  28. {
  29. *vNode = (STreeNode *)malloc(sizeof(STreeNode));
  30. (*vNode)->data = vData;
  31. (*vNode)->left = NULL;
  32. (*vNode)->right = NULL;
  33. }
  34.  
  35. void destroyNode(STreeNode **vNode)
  36. {
  37. (*vNode)->left = NULL;
  38. (*vNode)->right = NULL;
  39. free(*vNode);
  40. }
  41.  
  42. void createBinaryTree(STreeNode **vNode, int vPreIndex, int MidIndex, int vLen)
  43. {
  44. if (vLen == 0) return;
  45.  
  46. createNode(vNode, ArrPre[vPreIndex]);
  47. int MidPos = getMidPos(ArrPre[vPreIndex], MidIndex, MidIndex + vLen);
  48.  
  49. if(MidPos == -1)
  50. {
  51. CanBuild = 0;
  52. return;
  53. }
  54.  
  55. createBinaryTree(&((*vNode)->left), vPreIndex+1, MidIndex, MidPos-MidIndex);
  56. createBinaryTree(&((*vNode)->right), vPreIndex+(MidPos-MidIndex)+1,MidPos+1, vLen-1-(MidPos-MidIndex));
  57. }
  58.  
  59. void postTravelTree(STreeNode *vNode)
  60. {
  61. if (vNode == NULL) return;
  62. postTravelTree(vNode->left);
  63. postTravelTree(vNode->right);
  64. printf("%d ", vNode->data);
  65. }
  66.  
  67. void destroyBinaryTree(STreeNode **vNode)
  68. {
  69. if (*vNode == NULL) return;
  70. destroyBinaryTree(&((*vNode)->left));
  71. destroyBinaryTree(&((*vNode)->right));
  72. destroyNode(vNode);
  73. }
  74.  
  75. int main()
  76. {
  77. int N, i;
  78. STreeNode *Root;
  79.  
  80. while (scanf("%d", &N) != EOF)
  81. {
  82. for (i = 0; i < N; ++i) scanf("%d", &ArrPre[i]);
  83. for (i = 0; i < N; ++i) scanf("%d", &ArrMid[i]);
  84.  
  85. CanBuild = 1;
  86. createBinaryTree(&Root, 0, 0, N);
  87. if (!CanBuild)
  88. {
  89. printf("No\n");
  90. }
  91. else
  92. {
  93. postTravelTree(Root);
  94. printf("\n");
  95. }
  96.  
  97. destroyBinaryTree(&Root);
  98. }
  99.  
  100. return 0;
  101. }
  102. /**************************************************************
  103. Problem: 1385
  104. User:
  105. Language: C
  106. Result: Accepted
  107. Time:0 ms
  108. Memory:920 kb
  109. ****************************************************************/

027依据前序遍历和中序遍历,重建二叉树(keep it up)的更多相关文章

  1. POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)

    题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...

  2. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

  3. java编写二叉树以及前序遍历、中序遍历和后序遍历 .

    /** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...

  4. 【C++】根据二叉树的前序遍历和中序遍历重建二叉树并输出后续遍历

    /* 现在有一个问题,已知二叉树的前序遍历和中序遍历: PreOrder:GDAFEMHZ InOrder:ADEFGHMZ 我们如何还原这颗二叉树,并求出他的后序遍历 我们基于一个事实:中序遍历一定 ...

  5. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:    ...

  6. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  7. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

  8. 【算法编程 C++ Python】根据前序遍历、中序遍历重建二叉树

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

  9. 剑指offer--(根据前序遍历和中序遍历)重建二叉树

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

随机推荐

  1. Idea使用Maven搭建SpringMVC的HelloSpringMvc并配置插件Maven和Jetty

    这篇博文只是纯粹的搭建一个SpringMVC的项目, 并不会涉及里面配置文件该写些什么. 只是纯粹的搭建一个初始的Hello SpringMVC的项目. 废话不多说,上图. 1.  打开IDEA 并且 ...

  2. 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)

    被教练勒令做题不能看题解后的第一道新题,自行 yy 了好久终于 AC 了(菜啊)--写博客纪念. 题目: BZOJ1124 分析: 考虑每个人向他要打的人连边.根据题意,所有点都有且只有一条出边.那么 ...

  3. python导入包出错:ImportError: No module named XXXXX

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...

  4. UNIX环境高级编程--9. 进程控制

    进程关系    当子进程终止时,父进程得到通知并能取得子进程的退出状态. 终端登录:    早起UNIX系统通过哑终端登录,本地的终端 or 远程的终端 .主机上链接的终端设备是固定的,所以同时登录数 ...

  5. Offer收割_4

    1.水题 2.BFS宽搜(使用优先队列priority_queue) 4.题意:给数组a.要求重排列数组,使得数组中的任意相邻的两个元素不同.如果存在多个方案,那么选择字典序最小的方案.  如果不能满 ...

  6. 学习c语言的感想

    其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以,C语言的重要性不言而喻. 一.课本 无论用的是什么书,要学好C语言,把书上的每一个例题.习题的代码读 ...

  7. sql server 无法创建数据库,错误代码:1807

    SQL Server 不能创建数据库,发生错误:1807 :未能获得数据库 'model' 上的排它锁.请稍后重试操作. declare   @sql   varchar(100)     while ...

  8. MySQL索引----数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  9. react杂记

    React webpack+react (hello world) 项目结构: src: app.js main.js package.json webpack_dev_config.js 需要安装包 ...

  10. 常用animation动画

    /*编辑动画名*/ animation-name: myDemo; /*动画持续时间*/ animation-duration: 6s; /*动画方向*/ /*reverse 反向*/ /*alter ...