您的位置:首页 > 理论基础 > 数据结构算法

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息