很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后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[1010];
16 int t, n, m;
17 char dis[1010];
18 int pree[1010],ine[1010];
19
20 Node* BuildTree(int *pre, int *in, int length)      //建树
21 {
22     if(length == 0) return NULL;
23     Node* node = (Node*) malloc(sizeof(Node));
24     node->c = pre[0];
25     int rootindex = -1;
26     for(int i = 0;i < length;i++)
27     {
28         if(in[i] == pre[0])
29         {
30             rootindex = i;
31             break;
32         }
33     }
34     node->left = BuildTree(pre+1,in,rootindex);//left
35     node->right = BuildTree(pre+1+rootindex,in+rootindex+1,length-rootindex-1);//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)*10;
44         print(root->left);
45         if(root->right != NULL) fm[root->right->c] = (root->c)*10+1;
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 = 0; i < n; i++)
68         {
69             scanf("%d", &pree[i]);
70             ine[i] = i+1;
71         }
72         Node *root = BuildTree(pree, ine, n) ;
73         fm[root->c] = 0;                //就是这里,坑死我了……我@#¥%^&*!
74         print(root);
75         scanf("%d",&m);
76         for(int i = 0; i < m; i++)
77         {
78             int mid;
79             scanf("%d", &mid);
80             int k = 0;
81             while(fm[mid] != 0)
82             {
83                 if(fm[mid]%10 == 1) dis[k] = 'W';
84                 else dis[k] = 'E';
85                 mid = fm[mid]/10;
86                 k++;
87             }
88             for(int j = k-1; j >=0; j--) printf("%c", dis[j]);      //输出路径
89             printf("\n");
90         }
91         dfs(root);
92     }
93     return 0;
94 }

View Code

转载于:https://www.cnblogs.com/mypride/p/4814787.html

hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online...相关推荐

  1. HDU 5476 Explore Track of Point 几何题 —— 2015 ACM/ICPC Asia Regional Shanghai Online

    题目见HDU 5476 给出等腰三角形ABC,AB=AC,M为BC中点.P点为三角形内使min{∠MPB+∠APC,∠MPC+∠APB} 最大的点.求P点轨迹. 则容易找到中线AM上的P点都满足使得∠ ...

  2. HDU 5468 Puzzled Elena(2015 ACM/ICPC Asia Regional Shanghai Online)

    题目大意 这道题要求出每个节点与其子树节点中有多少个节点互质,题目是这样,但是如果你认为真的是这样那就错了,因为有可能根节点是1,那么1与本身也是互质的!!其实我真的搞不懂,说好了与子树互质为什么就把 ...

  3. HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)

    按身高排序,每个人前面最高的人数有上限,如果超出上限说明impossible, 每次考虑最小的人,把他放在在当前的从左往右第k+1个空位 因为要求字典序最小,所以每次k和(上限-k)取min值. 没有 ...

  4. [HDU] 5444.Elven Postman (堆)

    题意:对于一个堆,找出从根节点出发到某一个点的行走的路径 输入:第一行数据组数T,每一组第1行元素个数n,第2行各个元素,第3行询问个数,第4行询问元素. 输出:每一询问元素打印出由"E&q ...

  5. hdu 5023 poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5023 http://poj.org/problem?id=2777 题意:给出一个长度为N的线段,分 ...

  6. hdu 4283 You Are the One ( dp 2012 ACM/ICPC Asia Regional Tianjin Online )

    http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意: The TV shows such as You Are the One has been ver ...

  7. HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)...

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...

  8. Hdu 5873 2016 ACM/ICPC Asia Regional Dalian Online 1006(兰道定理)

    题解: 如果没有平手选项, 赢得加一分的话, 可以用Landau's Theorem(兰道定理)判定. 稍微修改一下这个定理就能做了. 假设S1,S2--,Sn是他们的得分序列,从小到大排个序.那么这 ...

  9. HDU 6194 String String String (后缀数组+线段树, 2017 ACM/ICPC Asia Regional Shenyang Online)

    Problem 求字符串 S 中严格出现 k 次的子串个数 k≥1k\ge 1 |S|≤105|S|\le 10^5 ∑|S|≤2×106\sum |S| \le 2\times 10^6 Idea ...

最新文章

  1. 服务器支持热部署吗,热部署
  2. 计算机里的游戏可以找回吗,找回电脑游戏作文
  3. C#变量命名的几种方式—C#基础回顾
  4. 悼念传奇,约翰询问#183;纳什和他的妻子艾丽西亚致敬,创建一个传奇,爱数学...
  5. PowerDesigner中的对象与关系映射建模
  6. Oracle11g创建表空间语句
  7. [PLSQL] 游标学习
  8. [Axis2与Eclipse整合开发Web Service系列之二] Top-Down方式,通过WSDL逆向生成服务端(续)
  9. matlab freqs函数用法,Matlab freqs 函数
  10. RSA 2019|远禾科技携YScanner荣获国际权威杂志认可
  11. [转帖]linux /proc目录下的文件为何无法用vi编辑保存
  12. 浅谈Cache Memory
  13. 2019年世界500强完整榜单,出炉!
  14. Gitee+PicGo+Typora图床搭建丨出现 Error: You must be logged in to use 的解决方法
  15. sed -n使用变量
  16. 【转载】如何打领带-普瑞特结
  17. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究(RTC-DS1302时钟)
  18. rtsp 华为_【V哥漫画安防】华为摄像机RTSP流常见问题解答
  19. 梦幻西游只知道服务器怎么找回,买回八年前的梦幻号,只为找回当年的美好
  20. Java 基础学习之类集框架 十 (SortedMap 接口)

热门文章

  1. ajax请求是宏任务还是微任务_微服务-如何解决链路追踪问题
  2. github服务器停止响应,如何解决“git pull,致命:无法访问'https://github.com ... \':服务器空回复”...
  3. python编写脚本方法_python 定时器,实现每天凌晨3点执行的方法
  4. java面向对象各章节教程_第二部分java面向对象编程第08章集合框架List1章节.ppt...
  5. wordpress linux位置,Linux 下搭建 WordPress 个人站点
  6. webpack 合并压缩_webpack的运用
  7. matlab 置顶曲线,matlab figure 最大,最小,置顶
  8. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为
  9. 英特尔核显自定义分辨率_华为推出两款MateBook D系列笔记本:搭载英特尔11代酷睿...
  10. sqlserver查询当月的每一天_SQL生成一年每一天的时间列表的几种方法