BOJ212 树的先序遍历
2011-09-19 11:24
204 查看
http://boj.me/onlinejudge/newoj/showProblem/show_problem.php?problem_id=212
这是区域赛北京赛区的一个题,题意不难,就是树的遍历过程。输入是一个长字符串,同一对括号中的字符串属于同一等级的结点,第一个是根结点,比如a(b,c(d,e),f)这个输入,表示根结点为a,a有三个子结点b,c,f,其中c有两个子结点d,e,要求根据输入的字符串得到以下信息:1、总结点数。2、各结点名(用字符串表示)。3、遍历过程(用数字序号表示各结点)。比如上面的输入得到的输出就是:
6
a
b
c
d
e
f
1 2
2 1
1 3
3 4
4 3
3 5
5 3
3 1
1 6
6 1
注意,不仅要输出从双亲结点到子结点的路径,也要输出从子结点返回双亲结点的路径。此题用栈结构很简单,时间方面还是很理想的。
这是区域赛北京赛区的一个题,题意不难,就是树的遍历过程。输入是一个长字符串,同一对括号中的字符串属于同一等级的结点,第一个是根结点,比如a(b,c(d,e),f)这个输入,表示根结点为a,a有三个子结点b,c,f,其中c有两个子结点d,e,要求根据输入的字符串得到以下信息:1、总结点数。2、各结点名(用字符串表示)。3、遍历过程(用数字序号表示各结点)。比如上面的输入得到的输出就是:
6
a
b
c
d
e
f
1 2
2 1
1 3
3 4
4 3
3 5
5 3
3 1
1 6
6 1
注意,不仅要输出从双亲结点到子结点的路径,也要输出从子结点返回双亲结点的路径。此题用栈结构很简单,时间方面还是很理想的。
#include<iostream> #include<stack> using namespace std; char str[1000005]; stack<int> s; int main() { int i, ncase; int top, cnt, len, k; bool flag; scanf("%d", &ncase); while (ncase--) { scanf("%s", str); len = strlen(str); while (!s.empty()) s.pop(); cnt = 0; flag = false; for (i=0; i<len; i++) { if (str[i]!='(' && str[i]!=')' && str[i]!=',') { flag = true; } else { if (flag==true) cnt++; flag = false; } } if (cnt==0) printf("1\n"); else printf("%d\n", cnt); flag = false; for (i=0; i<len; i++) { if (str[i]>='a' && str[i]<='z') flag = true, printf("%c", str[i]); else if (flag) flag = false, printf("\n"); } if (str[len-1]>='a' && str[len-1]<='z') printf("\n"); k = 1; flag = false; for (i=0; i<len; i++) { if (str[i]=='(') { if (!s.empty()) printf("%d %d\n", s.top(), k); s.push(k); k++; } else if (str[i]==',') { if (flag) { printf("%d %d\n", s.top(), k); printf("%d %d\n", k, s.top()); k++; flag = false; } else { top = s.top(); s.pop(); printf("%d %d\n", top, s.top()); } } else if (str[i]==')') { if (flag) { printf("%d %d\n", s.top(), k); printf("%d %d\n", k, s.top()); k++; flag = false; } else { top = s.top(); s.pop(); printf("%d %d\n", top, s.top()); } } else flag = true; } printf("\n"); } return 0; }
相关文章推荐
- boj 212(栈模拟)
- Head First C# 中文版 图文皆译 第六章 继承 page212
- 求幂集(线性表+先序遍历构造)
- boj 1334 思路混乱 弄了2个下午。。太笨了。。。 思路:先按起始时间排序,起始时间相同的,只保留结束时间最长的,然后判断。
- boj 1511 简单科学计算器 代码非常繁杂 思路不是特别好`
- boj 220(状态压缩DP)
- BOJ262 Channel Coding DP
- o.boj 1081 Bovine Latin
- o.boj 1440 取石子
- o.boj 1512 数字统计
- BOJ 394
- 输入先序遍历序列,建树----Java实现
- BOJ 204
- php递归无限级分类【先序遍历算】,获取任意节点下所有子孩子
- BOJ 316 Password dp
- 建一棵二叉树,能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数
- 由二叉树中序和先序遍历求二叉树的结构
- 先序遍历和中序遍历创建二叉树
- 数据结构练习题---先序遍历二叉树
- 如何理解二叉树的先序遍历程序