http://acm.hdu.edu.cn/showproblem.php?pid=1710
给出输的先序和中序求后序遍历。
#include<iostream>
#include<cstdio>
#include<stack>
#define N 1010
using namespace std;
int a[N],b[N];//分别存先序和中序
int n;
stack<int>st;
void fun(int l1,int r1,int l2,int r2)
{
int i,j;
st.push(a[l1]);
for(i=l2;i<=r2;i++)//找到根节点的位置
if(a[l1]==b[i]) break;
j=l1+(i-l2+1); //求右子树的开始位置
if(j<=r1&&i+1<=r2) //求右子树
fun(j,r1,i+1,r2);
if(l1+1<=j-1&&l2<=i-1)//求左子树
fun(l1+1,j-1,l2,i-1);
return ;
}
int main()
{
//freopen("input.txt","r",stdin);
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
fun(0,n-1,0,n-1);
while(!st.empty()){
printf("%d",st.top());
st.pop();
if(!st.empty())
printf(" ");
}
printf("\n");
}
return 0;
}