【PTA-1086】 Tree Traversals Again (25)
分析: 本质上就是前序+中序,输出后序
细节: 一个是输入数据的处理,一个是注意编号是从1开始的
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>
using namespace std;
const int maxn = 40;
// 前序+中序->后序
int n;
vector<int> preorder, postorder, inorder;
// 前序 + 中序
void build(int il, int ir, int pl, int pr)
{
if (il > ir)
return;
int root = preorder[pl];
int k;
for (k = il; k <= ir; k++)
{
if (inorder[k] == root)
{
// 结点编号从1开始进行计算
build(il, k - 1, pl + 1, pl + (k - il));
build(k + 1, ir, pl + (k - il) + 1, pr);
postorder.push_back(root);
}
}
}
int main(int argc, char const *argv[])
{
cin >> n;
stack<int> stk;
for (int i = 0; i < 2 * n; i++)
{
string op;
cin >> op;
if (op == "Push")
{
int x;
cin >> x;
preorder.push_back(x);
stk.push(x);
}
else
{
inorder.push_back(stk.top());
stk.pop();
}
}
build(0, n - 1, 0, n - 1);
for (int i = 0; i < n; i++)
{
if (i != 0)
cout << ' ' << postorder[i];
else
cout << postorder[i];
}
return 0;
}