PAT甲级1119. Pre- and Post-order Traversals

题意:

假设二叉树中的所有键都是不同的正整数。一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通过预序和顺序遍历序列来确定。然而,如果仅给出了后序和预序遍历序列,则相应的树可能不再是唯一的。

现在给出一对postorder和preorder遍历序列,你应该输出树的相应的顺序遍历序列。如果树不是唯一的,只需输出任何一个树。

输入规格:

每个输入文件包含一个测试用例。对于每种情况,第一行给出正整数N(<= 30),

二叉树中的节点总数。第二行给出了预订序列,第三行给出了后序序列。一行中的所有数字都以空格分隔。

输出规格:

对于每个测试用例,如果树是唯一的,则第一个printf为“是”,否则为“否”。

然后在下一行打印相应二叉树的顺序遍历序列。如果解决方案不是唯一的,任何答案都可以。保证至少有一个解决方案存在。一行中的所有数字必须只有一个空格分开,并且行尾不能有额外的空格。

思路:

二叉树的构造和遍历。题目感觉比较有点毛病。1A总让我感觉怪怪的。

ac代码:

C++

  1. // pat1119.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<string>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<vector>
  10. #include<cstring>
  11. #include<stdio.h>
  12. #include<map>
  13. #include<cmath>
  14. #include<unordered_map>
  15. #include<unordered_set>
  16. using namespace std;
  17. int n;
  18. int pre[31];
  19. int post[31];
  20. int in[31];
  21. struct TreeNode
  22. {
  23. int val;
  24. TreeNode* left;
  25. TreeNode* right;
  26. TreeNode(int x) : val(x) , left(NULL) , right(NULL) {}
  27. };
  28. bool flag = true;
  29. TreeNode* build(int prel, int prer, int postl, int postr)
  30. {
  31. if (prel > prer || postl > postr) return NULL;
  32. TreeNode* root = new TreeNode(pre[prel]);
  33. prel++;
  34. postr--;
  35. if (prel > prer || postl > postr) return root;
  36. int temp = postl;
  37. while (temp <= postr && post[temp] != pre[prel]) temp++;
  38. root->left = build(prel, prel + temp - postl, postl, temp);
  39. if (temp == postr)
  40. {
  41. flag = false;
  42. return root;
  43. }
  44. prel = prel + temp - postl + 1;
  45. postl = temp + 1;
  46. temp = postl;
  47. while (temp < postr && post[temp] != pre[prel]) temp++;
  48. root->right = build(prel, prel + temp - postl, postl, temp);
  49. return root;
  50. }
  51. void inorder(TreeNode* root)
  52. {
  53. if (!root) return;
  54. static int pos = 0;
  55. inorder(root->left);
  56. in[pos++] = root->val;
  57. inorder(root->right);
  58. }
  59. int main()
  60. {
  61. scanf("%d", &n);
  62. for (int i = 0; i < n; i++) scanf("%d", &pre[i]);
  63. for (int i = 0; i < n; i++) scanf("%d", &post[i]);
  64. TreeNode* root = build(0, n - 1, 0, n - 1);
  65. inorder(root);
  66. if (flag) printf("Yes\n");
  67. else printf("No\n");
  68. for (int i = 0; i < n - 1; i++)
  69. printf("%d ", in[i]);
  70. printf("%d\n", in[n - 1]);
  71. return 0;
  72. }

PAT甲级1119. Pre- and Post-order Traversals的更多相关文章

  1. PAT甲级|1151 LCA in a Binary Tree 先序中序遍历建树 lca

    给定先序中序遍历的序列,可以确定一颗唯一的树 先序遍历第一个遍历到的是根,中序遍历确定左右子树 查结点a和结点b的最近公共祖先,简单lca思路: 1.如果a和b分别在当前根的左右子树,当前的根就是最近 ...

  2. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  3. PAT甲级考前整理(2019年3月备考)之一

       转载请注明出处:https://www.cnblogs.com/jlyg/p/7525244.html 终于在考前,刷完PAT甲级131道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种 ...

  4. 【转载】【PAT】PAT甲级题型分类整理

    最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...

  5. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

  6. PAT甲级1114. Family Property

    PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...

  7. PAT甲级1107. Social Clusters

    PAT甲级1107. Social Clusters 题意: 当在社交网络上注册时,您总是被要求指定您的爱好,以便找到一些具有相同兴趣的潜在朋友.一个"社会群体"是一群拥有一些共同 ...

  8. PAT甲级1045. Favorite Color Stripe

    PAT甲级1045. Favorite Color Stripe 题意: 伊娃正在试图让自己的颜色条纹从一个给定的.她希望通过剪掉那些不必要的部分,将其余的部分缝合在一起,形成她最喜欢的颜色条纹,以保 ...

  9. PAT甲级1021. Deepest Root

    PAT甲级1021. Deepest Root 题意: 连接和非循环的图可以被认为是一棵树.树的高度取决于所选的根.现在你应该找到导致最高树的根.这样的根称为最深根. 输入规格: 每个输入文件包含一个 ...

随机推荐

  1. 工作常用shell集合

    <1>日志回滚案例======>[root@localhost test]# cat hbase.sh hbase_rotate_log ()       {    log=$1;  ...

  2. ios 个人开发者账户 给其他团队用坑爹的教程

    最新版本的 ios  支持 3个开发者证书 和 3个发布者证书  ,如果是多余3台电脑设备要真机调试,就比较麻烦 (手机支持100个设备) 解决方案就是: 在别人的电脑上要成功安装,须具备两个文件: ...

  3. java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)

    本文知识点(目录): 1.Number对象    2.Math对象    3.String对象    4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...

  4. git —— 基本命令以及操作(No.1)

    git基本命令(附加描述) 1.把文件添加到暂存区$ git add readme.txt 2.把暂存区的文件文件添加到仓库$ git commit -m "提交说明" 备注:ad ...

  5. Java 中判断字符串是否为空

    public class TestString { public static void main(String[] args) { String abc = null; //先判断是否为null再判 ...

  6. MAC下安装MAMP后,mysql server无法启动

    用MAC下载安装了MAMP,之前使用是很好没问题的,但是突然无法启动mysql server,检查日志,提示InnDB出错,然后删掉了/Application/MAMP/db/mysql56目录下的i ...

  7. matlab设定mex接驳的C/C++编译器

    使用C/C++编写核心算法,使用matlab调用算法.做上层封装,通常是提升效率并提供易用性的一个不错的选择. mex需要设定接驳的C/C++编译器,官方文档在这里:https://ww2.mathw ...

  8. C# 在RichTextBox根据内容自动调整高度

    private void richTextBox1_ContentsResized(object sender, ContentsResizedEventArgs e)   {   richTextB ...

  9. XeLaTeX下如何以原大小显示PNG

    在XeLaTeX里直接使用\includegraphics{test.png}这样的命令引入PNG,可能会发现图片直接被缩放到占满文档宽度,这是因为PNG这种bitmap类型的图片里通常不会带上met ...

  10. shell在linux里摇摇晃晃

    1.shell不只是一种解释器,还是一种编程工具 查看系统中可用的shell,linux默认使用 Bash Shell [root@localhost ~]# cat /etc/shells /bin ...