根据先序遍历中序遍历给出二叉树的后序遍历,入栈顺序就是先序遍历,出栈顺序就是中序遍历。然后按照步骤来做就好了。
#include <bits/stdc++.h>
using namespace std;
struct node {
int data;
node *lchild, *rchild;
};
int pre[40], in[40], n, ok = 0;
map<int, int> mp;
node* create(int prel, int prer, int inl, int inr) {
if (prel > prer) return NULL;
node* root = new node;
root->data = pre[prel];
int k = mp[pre[prel]];
int numleft = k - inl;
root->lchild = create(prel + 1, prel + numleft, inl, k - 1);
root->rchild = create(prel + numleft + 1, prer, k + 1, inr);
return root;
}
void postorder(node* root) {
if (root == NULL) return;
postorder(root->lchild);
postorder(root->rchild);
printf("%d", root->data);
if (++ok < n) printf(" ");
}
int main() {
int x, n1 = 0, n2 = 0;
scanf("%d", &n);
string s;
stack<int> st;
for (int i = 0; i < 2 * n; i++) {
cin >> s;
if (s == "Push") {
cin >> x;
st.push(x);
pre[n1++] = x;
} else {
in[n2++] = st.top();
st.pop();
}
}
for (int i = 0; i < n; i++) {
mp[in[i]] = i;
}
node* root = create(0, n - 1, 0, n - 1);
postorder(root);
return 0;
}