PAT1020
题意:给出一颗二叉树的中序和后序遍历,让你输出层序遍历,给出的值都是互不相等的正整数。
思路:因为后序的最后一个总是根结点,令i在中序中找到该根结点,则i把中序分为两部分,左边是左子树,右边是右子树,于是可以递归地去处理。在递归的过程中加一个标记用于重新排序,按照层序重新排序后输出即可
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node
{
int index;
int val;
};
bool cmp(node a, node b)
{
return a.index<b.index;
}
vector<int> post,in;
vector<node> ans;
void pre(int root, int start, int end, int index)
{
if(start>end)
return;
int i=start;
while(in[i]!=post[root]&&i<end)
i++;
ans.push_back({index, post[root]});
pre(root-1-end+i,start,i-1,2*index+1);
pre(root-1,i+1,end,2*index+2);
}
int main()
{
int n;
scanf("%d",&n);
post.resize(n);
in.resize(n);
for(int i=0;i<n;i++)
scanf("%d",&post[i]);
for(int i=0;i<n;i++)
scanf("%d",&in[i]);
pre(n-1,0,n-1,0);
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++)
{
if(i!=0)
cout<<" ";
cout<<ans[i].val;
}
}