虽然这个问题很水,但是之前打的都特别烦,今天发现一个优雅的写法,记录一下
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const double PI=acos(-1);
typedef long long ll;
const int maxn=1e5+50;
const int mod=1e9+7;
struct Node{
int val;
Node *lson,*rson;
Node(int val) : val(val) {}
};
map<int,int> inOrderIndexMap;
Node *buildPostIn(int postOrder[],int inOrder[],int len,int subStartPos){
if (len==0) return NULL;
int rootVal=postOrder[len-1];
int leftLen=inOrderIndexMap[rootVal]-subStartPos;
Node *root=new Node(rootVal);
root->lson=buildPostIn(postOrder,inOrder,leftLen,subStartPos);
root->rson=buildPostIn(postOrder+leftLen,inOrder,len-leftLen-1,subStartPos+leftLen+1);
return root;
}
//subStartPos子树在中序中的开始位置
Node *buildPreIn(int preOrder[],int inOrder[],int len,int subStartPos){
if (len==0) return NULL;
int rootVal=preOrder[0];
int leftLen=inOrderIndexMap[rootVal]-subStartPos;
Node *root=new Node(rootVal);
root->lson=buildPreIn(preOrder+1,inOrder,leftLen,subStartPos);
root->rson=buildPreIn(preOrder+leftLen+1,inOrder,len-leftLen-1,subStartPos+leftLen+1);
return root;
}
int preOrder[maxn],inOrder[maxn],postOrder[maxn];
int n;
int levelOrder[maxn];
void bfs(Node *rt){
queue<Node*>qu;
qu.push(rt);
int tot=0;
while (!qu.empty()){
Node *tp=qu.front();
qu.pop();
levelOrder[tot++]=tp->val;
if (tp->lson) qu.push(tp->lson);
if (tp->rson) qu.push(tp->rson);
}
}
void getPreOeder(Node *rt){
if (!rt) return;
printf("%d ",rt->val);
getPreOeder(rt->lson);
getPreOeder(rt->rson);
}
int main()
{
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&postOrder[i]);
}
inOrderIndexMap.clear();
for(int i=0;i<n;i++){
scanf("%d",&inOrder[i]);
inOrderIndexMap[inOrder[i]]=i;
}
Node *root=buildPostIn(postOrder,inOrder,n,0);
//Node *root=buildPreIn(preOrder,inOrder,n,0);
bfs(root);
for(int i=0;i<n-1;i++) printf("%d ",levelOrder[i]);
printf("%d\n",levelOrder[n-1]);
}
return 0;
}