题目:
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:7 2 3 1 5 7 6 4 1 2 3 4 5 6 7输出样例:
4 1 6 3 5 7 2
思路:树的基本操作,用递归实现。
代码:
//By Sean Chen
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define null -1
using namespace std;
int n;
int post[35],inorder[35];
struct node{
int num,l,r;
};
node tree[35];
int p,pos;
int dfs(int l,int r)
{
if (l>r)
return null;
pos--;
int temp=post[pos],temppos;
for (int i=l;i<=r;i++)
if (inorder[i]==temp)
{
temppos=i;
break;
}
p++;
int tempp=p;
tree[tempp].num=temp;
tree[tempp].r=dfs(temppos+1,r);
tree[tempp].l=dfs(l,temppos-1);
return tempp;
}
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d",&post[i]);
for (int j=0;j<n;j++)
scanf("%d",&inorder[j]);
pos=n;
int root=dfs(0,n-1);
queue <node> q;
q.push(tree[root]);
printf("%d",tree[root].num);
while (q.size())
{
node t=q.front();
q.pop();
if (t.l!=null)
{
printf(" %d",tree[t.l].num);
q.push(tree[t.l]);
}
if (t.r!=null)
{
printf(" %d",tree[t.r].num);
q.push(tree[t.r]);
}
}
return 0;
}