二叉树的遍历
Description给出一棵二叉树的中序和前序遍历,输出它的后序遍历。Input
4 2 5 1 6 3 7
Source2014 Winter Holiday Contest 5AuthorTwIStOy
Time Limit: 1000 MS | Memory Limit: 32768 K |
Total Submit: 286(74 users) | Total Accepted: 118(68 users) | Rating: ![]() ![]() ![]() | Special Judge: No |
本题有多组数据,输入处理到文件结束。
每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。
接下来的一行每行包括n个整数,表示这棵树的中序遍历。
接下来的一行每行包括n个整数,表示这棵树的前序遍历。
3<= n <= 100
Output每组输出包括一行,表示这棵树的后序遍历。Sample Input 74 2 5 1 6 3 7
1 2 4 5 3 6 7
思路:二叉树基础,必须搞懂 前序遍历,中序遍历, 后序遍历。这个题有个小坑, 输出结果后有一个空格然后回车。
#include<stdio.h>
const int maxn=110;
int pre[maxn], in[maxn], pos[maxn], cnt;
int find(int tgt, int l, int r)
{
for(int i=l; i<r; i++)
{
if(in[i]==tgt)
return i;
}
}
void posOrder(int prel, int prer, int inl, int inr)
{
if(prel==prer)
return;
int root=find(pre[prel], inl, inr);
int len=root-inl;
posOrder(prel+1, prel+1+len, inl, inl+len);
posOrder(prel+1+len, prer, inl+len+1, inr);
pos[cnt++]=in[root];
return;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
cnt=0;
for(int i=0; i<n; i++)
scanf("%d", in+i);
for(int i=0; i<n; i++)
scanf("%d", pre+i);
posOrder(0, n, 0, n);
for(int i=0; i<n; i++)
printf("%d ", pos[i]);
printf("\n");
}
return 0;
}