根据前序和后序序列建树,建树时顺便记录层次。
深度优先遍历树,单数层直接将node压入vector,双数层的结点压入栈中,等到单数层或者深度遍历结束后再压入vector。
此处注意,深度优先遍历后应当检查栈中是否有结点,有应当压入vector。
#include<cstdio>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
int inorder[32], postorder[32];
struct node {
int d, level;
node *l, *r;
};
node* buildtree(int inl, int inr, int pl, int pr, int level) {
if (pl >= pr) return NULL;
node* root = new node;
root->d = postorder[pr - 1];
root->level = level;
int i;
for (i = inl; i < inr; i++) {
if (inorder[i] == root->d) break;
}
int num = i - inl;
root->l = buildtree(inl, i, pl, pl + num, level + 1);
root->r = buildtree(i + 1, inr, pl + num, pr - 1, level + 1);
return root;
}
vector<node> ZigZagging(node *root) {
vector<node> ve;
stack<node> st;
queue<node> q;
q.push(*root);
while(!q.empty()) {
node t = q.front();
q.pop();
if (t.level % 2 == 0) {
st.push(t);
}
else {
while (!st.empty()) {
node s = st.top();
ve.push_back(s);
st.pop();
}
ve.push_back(t);
}
if (t.l != NULL) q.push(*(t.l));
if (t.r != NULL) q.push(*(t.r));
}
while (!st.empty()) {
node s = st.top();
ve.push_back(s);
st.pop();
}
return ve;
}
int main() {
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &inorder[i]);
}
for (int i = 0; i < N; i++) {
scanf("%d", &postorder[i]);
}
node* root = buildtree(0, N, 0, N, 0);
vector<node> ve = ZigZagging(root);
for (int i = 0; i < ve.size(); i++) {
printf("%d", ve[i].d);
if (i != ve.size() - 1) printf(" ");
else printf("\n");
}
return 0;
}