hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online
很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后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……
不说了,说多了都是泪。。。。。
上代码——
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include <cmath>
#include <algorithm>
using namespace std; struct Node
{
int c;
Node *left;
Node *right;
}; int fm[];
int t, n, m;
char dis[];
int pree[],ine[]; Node* BuildTree(int *pre, int *in, int length) //建树
{
if(length == ) return NULL;
Node* node = (Node*) malloc(sizeof(Node));
node->c = pre[];
int rootindex = -;
for(int i = ;i < length;i++)
{
if(in[i] == pre[])
{
rootindex = i;
break;
}
}
node->left = BuildTree(pre+,in,rootindex);//left
node->right = BuildTree(pre++rootindex,in+rootindex+,length-rootindex-);//right
return node;
} void print(Node *root) //记录父节点
{
if(root != NULL)
{
if(root->left != NULL) fm[root->left->c] = (root->c)*;
print(root->left);
if(root->right != NULL) fm[root->right->c] = (root->c)*+;
print(root->right);
}
} void dfs(Node* root) //释放内存
{
if(root != NULL)
{
if(root->left != NULL) dfs(root->left);
if(root->right != NULL) dfs(root->right);
free(root);
}
} int main()
{
//freopen("test.in", "r", stdin);
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = ; i < n; i++)
{
scanf("%d", &pree[i]);
ine[i] = i+;
}
Node *root = BuildTree(pree, ine, n) ;
fm[root->c] = ; //就是这里,坑死我了……我@#¥%^&*!
print(root);
scanf("%d",&m);
for(int i = ; i < m; i++)
{
int mid;
scanf("%d", &mid);
int k = ;
while(fm[mid] != )
{
if(fm[mid]% == ) dis[k] = 'W';
else dis[k] = 'E';
mid = fm[mid]/;
k++;
}
for(int j = k-; j >=; j--) printf("%c", dis[j]); //输出路径
printf("\n");
}
dfs(root);
}
return ;
}
hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online的更多相关文章
- 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 ...
- 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 ...
- (二叉树)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) ...
- (并查集)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 ...
- 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 ...
- 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 ...
- (线段树 区间查询)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/ ...
- Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)
题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...
- 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.. ...
随机推荐
- OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性
看了openstack没几天,然后就开始试着用Java调用所有的API,第一步得到Credentials的时候成功了,然后第二步,传参数使所有的server信息都列出来的时候报错404.具体描述如下( ...
- ubuntu下搭建cocos2dx编程环境-中
上篇文章里讲了在ubuntu下部署cocos2d-x开发环境,这篇文章主要示范在ubuntu下部署cocos2d-x android开发环境.分开写就是因为我看很多文章里都将这两件事情混杂着写 ...
- 如何在Java客户端调用RESTful服务
在这个例子中,我们将看到如何使用java.net包实用工具,创建一个访问REST服务RESTful的客户端.当然这不是创建一个RESTful客户端最简单的方法,因为你必须自己读取服务器端的响应,以及J ...
- 运用CodeSmith Studio实现C#项目构架
http://www.cnblogs.com/iCaca/category/80950.html http://www.cnblogs.com/BlueBreeze/archive/2011/07/1 ...
- 堆的 两种实现 (数组和STL)
基本思想: 两种操作都跟树的深度成正比,所以复杂度 O(log(n)) ; push():在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提直到没有大小颠倒为止. pop(): 从堆中取出 ...
- build.gradle(Project) 和 build.gradle(Module) 的区别
参考: http://stackoverflow.com/questions/28295933/difference-between-build-gradleproject-and-build-gra ...
- 了解thinkphp(二)
ThinkPHP的核心文件: Library文件夹下的Think文件夹目录 ThinkPHP的入口文件是: ThinkPHP.php , 我们在创建项目时都要引入这个入口文件!!! 一 , 项目的部署 ...
- Python 数据类型转换
Python提供的基本数据类型主要有:布尔类型.整型.浮点型.字符串.列表.元组.集合.字典.日期等等 函数 描述 type(x) x的数据类型 ...
- [HIHO1323]回文字符串(区间dp)
题目链接:http://hihocoder.com/problemset/problem/1323 思路:区间dp,按照区间长度枚举所有区间和区间的起始位置.这时也可获取到区间的末位,比对这两个字符是 ...
- JavaScript中typeof知多少?
typeof运算符介 绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你 知道下面typeof运算的结果吗? typeof ...