建树思路:通过前序遍历和中序遍历构建一棵二叉树,最后再后序遍历一次即可。先序序列:元素入栈顺序,中序序列:元素出栈顺序。
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<stack>
using namespace std;
const int N = 35;
int n;
int cnt1 = 0, cnt2 = 0; //用来标记前序、中序序列元素
int a[N], b[N]; //前序序列、中序序列
int lc[N], rc[N];
vector<int> res;
stack<int> st;
map<int, int> pos; //记录中序序列元素位置
int build(int l, int r, int pl, int pr)
{
if(l > r) return 0;
int u = a[pl];
int pu = pos[u];
int lnum = pu - l;
int v1 = build(l, pu - 1, pl + 1, pl + lnum);
int v2 = build(pu + 1, r, pl + lnum + 1, pr);
if(v1) lc[u] = v1;
if(v2) rc[u] = v2;
return u;
}
void postOrder(int u)
{
if(!u) return;
postOrder(lc[u]);
postOrder(rc[u]);
res.push_back(u);
}
int main()
{
cin >> n;
for(int i = 1; i <= n * 2; i++)
{
string t;
cin >> t;
if(t == "Push")
{
int val;
cin >> val;
a[++cnt1] = val;
st.push(val);
}
else
{
int val = st.top();
st.pop();
b[++cnt2] = val;
pos[val] = cnt2;
}
}
int root = build(1, n, 1, n);
postOrder(root);
for(int i = 0; i < res.size(); i++)
printf("%d%c", res[i], i == res.size() - 1 ? '\n' : ' ');
return 0;
}