通过前序遍历和中序遍历求树的后序遍历
//
// main.cpp
// PATA1086
//
// Created by Phoenix on 2018/2/19.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int pre[40], in[40], post[40];
int n;
struct node {
int data;
node *lchild, *rchild;
};
node* newnode(int x) {
node* root = new node;
root->data = x;
root->lchild = root->rchild = NULL;
return root;
}
node* create(int preL, int preR, int inL, int inR) {
if(preL > preR) return NULL;
node* root = newnode(pre[preL]);
//printf("%d ", pre[preL]);
int k;
for(int i = inL; i <= inR; i++) {
if(in[i] == pre[preL]) k = i;
}
root->lchild = create(preL + 1, preL + k - inL, inL, k - 1);
root->rchild = create(preL + k - inL + 1, preR, k + 1, inR);
return root;
}
int num = 0;
void postorder(node* root) {
if(root == NULL) return;
postorder(root->lchild);
postorder(root->rchild);
printf("%d", root->data);
if(num++ < n - 1) printf(" ");
else printf("\n");
}
int main(int argc, const char * argv[]) {
int num1 = 0, num2 = 0;
scanf("%d", &n);
stack<int> st;
for(int i = 0; i < 2 * n; i++) {
char s[5];
scanf("%s", s);
if(s[1] == 'u') {
scanf("%d", &pre[num1]);
st.push(pre[num1++]);
} else {
int top = st.top();
st.pop();
in[num2++] = top;
}
}
node* root = create(0, n - 1, 0, n - 1);
postorder(root);
return 0;
}