很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死……

题意:

题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了!

反复读题,终于在偶然间注意到了这一句——"Not only that, when numbering the rooms, they always number the room number from the east-most position to the west."

它告诉我们,东边的点总是比西边的点小——也就是说,这个树的中序遍历是从1到n的一个等差数列……

输入:

首行输入一个整数t,表示有t组数据;

接下来每组数据首行一个整数n,表示有这棵树有n个节点。

接下来一行有n个整数,表示这棵树的先序遍历。

接下来一行一个整数m,表示m次查询。

接下来一行有m个整数,表示每次查询的点。

输出:

每次查询输出从根节点到查询节点的路径,路径中,每次向左输出'E',每次向右输出'W'。

解题思路:

套上模板,建立起这棵树,同时用一个fm[]数组讲每个节点的父节点记录下来。然后查询的时候使用就行了。

但是有两点需要注意:

1. 由于我是使用指针建立的树,所以每用完一组数据都要记得释放内存!

2. 每次第二组数据的根节点也许在第一组数据中不是根节点,所以要记得将根节点的父节点fm[root]置为0。我的现场赛名额啊……因此离我而去T_T,555555……

不说了,说多了都是泪。。。。。

上代码——

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. struct Node
  9. {
  10. int c;
  11. Node *left;
  12. Node *right;
  13. };
  14.  
  15. int fm[];
  16. int t, n, m;
  17. char dis[];
  18. int pree[],ine[];
  19.  
  20. Node* BuildTree(int *pre, int *in, int length) //建树
  21. {
  22. if(length == ) return NULL;
  23. Node* node = (Node*) malloc(sizeof(Node));
  24. node->c = pre[];
  25. int rootindex = -;
  26. for(int i = ;i < length;i++)
  27. {
  28. if(in[i] == pre[])
  29. {
  30. rootindex = i;
  31. break;
  32. }
  33. }
  34. node->left = BuildTree(pre+,in,rootindex);//left
  35. node->right = BuildTree(pre++rootindex,in+rootindex+,length-rootindex-);//right
  36. return node;
  37. }
  38.  
  39. void print(Node *root) //记录父节点
  40. {
  41. if(root != NULL)
  42. {
  43. if(root->left != NULL) fm[root->left->c] = (root->c)*;
  44. print(root->left);
  45. if(root->right != NULL) fm[root->right->c] = (root->c)*+;
  46. print(root->right);
  47. }
  48. }
  49.  
  50. void dfs(Node* root) //释放内存
  51. {
  52. if(root != NULL)
  53. {
  54. if(root->left != NULL) dfs(root->left);
  55. if(root->right != NULL) dfs(root->right);
  56. free(root);
  57. }
  58. }
  59.  
  60. int main()
  61. {
  62. //freopen("test.in", "r", stdin);
  63. scanf("%d", &t);
  64. while(t--)
  65. {
  66. scanf("%d", &n);
  67. for(int i = ; i < n; i++)
  68. {
  69. scanf("%d", &pree[i]);
  70. ine[i] = i+;
  71. }
  72. Node *root = BuildTree(pree, ine, n) ;
  73. fm[root->c] = ; //就是这里,坑死我了……我@#¥%^&*!
  74. print(root);
  75. scanf("%d",&m);
  76. for(int i = ; i < m; i++)
  77. {
  78. int mid;
  79. scanf("%d", &mid);
  80. int k = ;
  81. while(fm[mid] != )
  82. {
  83. if(fm[mid]% == ) dis[k] = 'W';
  84. else dis[k] = 'E';
  85. mid = fm[mid]/;
  86. k++;
  87. }
  88. for(int j = k-; j >=; j--) printf("%c", dis[j]); //输出路径
  89. printf("\n");
  90. }
  91. dfs(root);
  92. }
  93. return ;
  94. }

hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online的更多相关文章

  1. 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online

    Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...

  3. (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)

    http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others)  ...

  4. (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memo ...

  5. HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)

    Elven Postman Elves are very peculiar creatures. As we all know, they can live for a very long time ...

  6. 2015 ACM/ICPC Asia Regional Changchun Online Pro 1008 Elven Postman (BIT,dfs)

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/ ...

  8. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  9. Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)

    题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...

随机推荐

  1. Hadoop 在windows 上伪分布式的安装过程

    第一部分:Hadoop 在windows 上伪分布式的安装过程 安装JDK 1.下载JDK        http://www.oracle.com/technetwork/java/javaee/d ...

  2. 学了C语言,如何利用cURL写一个程序验证某个网址的有效性?

    在<C程序设计伴侣>以及这几篇关于cURL的文章中,我们介绍了如何利用cURL写一个下载程序,从网络下载文件.可是当我们在用这个程序下载文件时,又遇到了新问题:如果这个网址是无效的,那么我 ...

  3. 处理11gR2 RAC集群资源状态异常INTERMEDIATE,CHECK TIMED OUT

    注意节点6,7的磁盘CRSDG的状态明显不正常.oracle@ZJHZ-PS-CMREAD-SV-RPTDW06-DB-SD:~> crsctl status resource -t |less ...

  4. SpringMVC整合Shiro——(3)

    SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...

  5. code manager tools git的使用;

    git的使用 一.下载及安装: 1.下载:https://github.com 2.安装: 二.常用命令: 查看.添加.提交.删除.找回,重置修改文件 git help< command> ...

  6. c# 计算1-100之间的所有整数的和

    求1-100所有整数和: class Program { static void Main(string[] args) { ,); Console.WriteLine("1-100之间所有 ...

  7. (七)后台.apsx.cs获取前台客户端文本框的内容

    <input ID='AllLocalData' name='AllLocalDataName' /> 其中最重要的一点是Request.Form[]中括号是放的name属性而非Id属性. ...

  8. Weblogic控制器的部署

    WebLogic的安装 一 WebLogic安装 1.  打开WebLogic安装程序:oepe11_wls1031.exe(我们选用的是WebLogic 10.3g).如图1-1所示: 图1-1   ...

  9. poj - 1258 Agri-Net (最小生成树)

    http://poj.org/problem?id=1258 FJ为了竞选市长,承诺为这个地区的所有农场联网,为了减少花费,希望所需光纤越少越好,给定每两个农场的花费,求出最小花费. 最小生成树. # ...

  10. Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】

    I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ...