PAT 团体程序设计天梯赛-练习集 L2-006. 树的遍历【数据结构】
2016-05-19 20:57
399 查看
题目连接
https://www.patest.cn/contests/gplt/L2-006思路
给你一棵二叉树的后序和中序遍历,叫你输出层次遍历。首先找到根节点,就是后序的最后一个数。
然后分别在中序中找这个数的左边和右边,分别挑出在后序中排最后的数,注意遇到已经确定过的数要停止搜索。
AC代码
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <unordered_map> using namespace std; int tree[50]; int post[50], in[50], vis[50]; unordered_map<int, int>order; int main() { int n; scanf("%d",&n); for(int i=1 ; i<=n ; ++i) { scanf("%d",&post[i]); order[post[i]]=i; } for(int i=1 ; i<=n ; ++i) { scanf("%d",&in[i]); } queue<int>q; q.push(post ); int cnt=1; for(int step=1 ; step<=n ; ++step) { int u=q.front(); q.pop(); vis[u]=1; tree[cnt++]=u; for(int i=1 ; i<=n ; ++i)if(in[i]==u) { int max_order=0, last_num=-1; for(int j=i-1 ; j>=1 && !vis[in[j]] ; --j) { if(order[in[j]]>max_order) { max_order=order[in[j]]; last_num=in[j]; } } if(last_num!=-1) q.push(last_num); max_order=0; last_num=-1; for(int j=i+1 ; j<=n && !vis[in[j]] ; ++j) { if(order[in[j]]>max_order) { max_order=order[in[j]]; last_num=in[j]; } } if(last_num!=-1) q.push(last_num); break; } } for(int i=1 ; i<cnt ; ++i) { if(i==1) printf("%d", tree[i]); else printf(" %d", tree[i]); } printf("\n"); return 0; }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- AVL树-自平衡二叉查找树(Java实现)
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- 文件遍历排序函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#中遍历Hashtable的4种方法
- C#数据结构之单链表(LinkList)实例详解
- Erlang中遍历取出某个位置的最大值代码
- 数据结构之Treap详解
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- C++深度优先搜索的实现方法