1. 剑指Offer - 九度1385 - 重建二叉树
    2013-11-23 23:53
题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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
  2. 1 2 4 7 3 5 6 8
  3. 4 7 2 1 5 3 8 6
  4. 8
  5. 1 2 4 7 3 5 6 8
  6. 4 1 2 7 5 3 8 6
样例输出:
  1. 7 4 2 5 8 6 3 1
  2. No
  1. 题意分析:
      给定一棵二叉树的前序遍历和中序遍历,计算出对应的后序遍历。如果给定的数据不是有效的遍历,则输出“No”。
        前序遍历:根-左子树-右子树
        中序遍历:左子树-根-右子树
        后序遍历:左子树-右子树-根
      因此,前序遍历的第一个节点为根节点,根据根节点的值在中序遍历中找到其对应位置,左边是左子树,右边是右子树,然后左右递归求解即可。
      需要注意的是:输出后序遍历时,根节点最后输出,所以递归求解时,也应该在左右子树递归完成之后才处理根节点。
      由于每次找出在中序遍历中找根节点的位置需要O(n)的查找时间,O(1)处理根节点,于是有T(n) = 2 * T(n / 2) + O(n) + O(1),推导下复杂度:
        T(n) = 2 * T(n / 2) + O(1) + O(n)
  2.     T(n) = 2 * T(n / 2) + O(n)
        T(n) = 4 * T(n / 4) + 2 * (O(n / 2)) + O(n)
        T(n) = 4 * T(n / 4) + 2 * O(n)
        T(n) = 2 ^ log(n) * T(1) + log(n) * O(n)
        T(n) = O(n) + O(n * log(n))
        T(n) = O(n * log(n))
      递归求解,因为每个节点都会被递归到,所以空间复杂度为O(n)。
  1. // 651379 zhuli19901106 1385 Accepted 点击此处查看所有case的执行结果 1024KB 1256B 0MS
  2. //
  3. #include <cstdio>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. void construct_tree(vector<int> &a, vector<int> &b, vector<int> &c, int l1, int r1, int l2, int r2)
  8. {
  9. if(l1 > r1 || l2 > r2){
  10. return;
  11. }
  12.  
  13. if(r1 - l1 != r2 - l2){
  14. return;
  15. }
  16.  
  17. int mid;
  18. int nl, nr;
  19.  
  20. for(mid = l2; mid <= r2; ++mid){
  21. if(b[mid] == a[l1]){
  22. nl = mid - l2;
  23. nr = r2 - mid;
  24. if(nl > ){
  25. construct_tree(a, b, c, l1 + , l1 + nl, l2, mid - );
  26. }
  27. if(nr > ){
  28. construct_tree(a, b, c, r1 - nr + , r1, mid + , r2);
  29. }
  30. c.push_back(a[l1]);
  31. return;
  32. }
  33. }
  34.  
  35. }
  36.  
  37. int main()
  38. {
  39. vector<int> a, b, c;
  40. int n;
  41. int tmp;
  42. int i;
  43.  
  44. while(scanf("%d", &n) == ){
  45. for(i = ; i < n; ++i){
  46. scanf("%d", &tmp);
  47. a.push_back(tmp);
  48. }
  49. for(i = ; i < n; ++i){
  50. scanf("%d", &tmp);
  51. b.push_back(tmp);
  52. }
  53. c.clear();
  54. construct_tree(a, b, c, , n - , , n - );
  55. a.clear();
  56. b.clear();
  57. if(c.size() < n){
  58. printf("No\n");
  59. }else{
  60. for(i = ; i < n; ++i){
  61. printf("%d ", c[i]);
  62. }
  63. printf("\n");
  64. }
  65. c.clear();
  66. }
  67.  
  68. return ;
  69. }

剑指Offer - 九度1385 - 重建二叉树的更多相关文章

  1. 剑指Offer - 九度1523 - 从上往下打印二叉树

    剑指Offer - 九度1523 - 从上往下打印二叉树2013-12-01 00:35 题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以E ...

  2. 剑指Offer - 九度1521 - 二叉树的镜像

    剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...

  3. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  4. 剑指Offer - 九度1350 - 二叉树的深度

    剑指Offer - 九度1350 - 二叉树的深度2013-11-23 00:54 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的 ...

  5. 剑指Offer - 九度1524 - 复杂链表的复制

    剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...

  6. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  7. 剑指Offer - 九度1520 - 树的子结构

    剑指Offer - 九度1520 - 树的子结构2013-11-30 22:17 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每 ...

  8. 剑指Offer - 九度1508 - 把字符串转换成整数

    剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...

  9. 剑指Offer - 九度1504 - 把数组排成最小的数

    剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...

随机推荐

  1. 笨办法学Python(十四)

    习题 14:提示和传递 让我们使用 argv 和 raw_input 一起来向用户提一些特别的问题.下一节习题你会学习如何读写文件,这节练习是下节的基础.在这道习题里我们将用略微不同的方法使用 raw ...

  2. 复制windows CMD命令行中的内容

    标记文本后,按"回车",或鼠标"右键"为从CMD中复制文本. 在CMD中,按鼠标"右键",为在CMD中粘贴文本.

  3. May 2 2017 Week 18 Tuesday

    The beauty of the journey is found in the scenery along the way. 旅行之美在于沿途所见的风景. Several years ago, I ...

  4. 实现pdf word在线浏览和下载

    这篇实现的是在线展示pdf和word并且不能显示下载和打印按钮 一 下载功能: 因为html5给a标签新添加了一个属性download,这个属性可以直接实现下载文件的功能:<a href=&qu ...

  5. IOS 拉伸图片(封装)

    /** * 根据图片名返回一张能够自由拉伸的图片 */ +(UIImage *)resizedImage:(NSString *)name { UIImage *image=[UIImage imag ...

  6. POJ-2002 Squares---绕点旋转+Hash

    题目链接: https://vjudge.net/problem/POJ-2002 题目大意: 有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少. 相同的四个点,不同顺序构成的正方形视 ...

  7. telegram汉化和代理

    telegram在Ubuntu18.04的应用商店中可以一键下载. 1.注册:用国内手机号即可,就是验证码可能很慢. 2.汉化:关注zh-CN 频道,在点击其中的安装链接即可. 3.代理: 如果你使用 ...

  8. 零基础Centos6搭建Git服务器,及常见问题解决

    1.编译安装git 2.1 服务器端: #yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl- ...

  9. Spring boot 自动配置自定义配置文件

    示例如下: 1.   新建 Maven 项目 properties 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  10. Git永久删除commit--[非教程]

    假设当前分支为master,当前的commit情况如下,现在需要删除commit_id_2和commit_id_4: commit_id_1 commit_id_2 commit_id_3 commi ...