题意很简单:中后序建树,然后按Z字形输出
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
#define N 100005
struct Node {
Node *lchild,*rchild;
int c;
};
int post[30], in[30];
Node * build(int postL,int postR,int inL,int inR)
{
if(postL>postR) return NULL;
Node * root=new Node;
root->c=post[postR];
int index;
for(index=inL;index<=inR;index++)
{
if(in[index]==post[postR])
{
break;
}
}
int numLeft=index-inL;
root->lchild= build(postL,postL+numLeft-1,inL,index-1);
root->rchild= build(postL+numLeft,postR-1,index+1,inR);
return root;
}
void Lever_post(Node *T) {
queue<Node*> Q;
vector<vector<int> > ans;
vector<int> tmp;
Q.push(T);
Q.push(NULL);
while (!Q.empty()) {
Node* p = Q.front();
Q.pop();
if (p == NULL) {
ans.push_back(tmp);
tmp.clear();
if (Q.size() > 0)
Q.push(NULL);
}
else {
tmp.push_back(p->c);
if (p->lchild)
Q.push(p->lchild);
if (p->rchild)
Q.push(p->rchild);
}
}
for (int i = 0; i < ans.size(); ++i) {
if (i && i % 2 == 0)
reverse(ans[i].begin(), ans[i].end());
}
for (int i = 0; i < ans.size(); ++i) {
for (int j = 0; j < ans[i].size(); ++j) {
if (i || j) cout << " ";
cout << ans[i][j];
}
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &in[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &post[i]);
}
Node *T = build(0, n - 1, 0, n - 1);
Lever_post(T);
printf("\n");
return 0;
}