分析:进栈的顺序便是先序遍历,出栈的顺序是中序遍历,由中序+先序即可求后序序列,由于题目说明了结点从1到N编号,因此无重复编号,可用下面做法:
1. 先序:根左右
2. 中序:左根右
3. 后序:左右根
先序的根找到对应中序的根的位置,再递归中序根左边的位置,根右边的位置,最后将根放进数组。
当然也可以先建树再求后序遍历。
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int in[37], pre[37], post[37], len3;
stack<int> s;
void getPost(int prel, int prer, int il, int ir){
if(prel > prer) return ;
int mid = il, diff;
for(mid = il; mid<=ir; mid++){
if(in[mid] == pre[prel]) break;
}
diff = mid-il;
getPost(prel+1, prel+diff, il, mid-1);
getPost(prel+diff+1, prer, mid+1, ir);
post[len3++] = pre[prel];
}
int main(){
//freopen("aa.txt", "r", stdin);
int n, m, num, len1 = 0, len2 = 0;
cin >> n;
m = 2*n;
string tem;
for(int i = 0; i<m; i++){
cin >> tem;
if(tem == "Push"){
cin >> num;
s.push(num);
pre[len1++] = num;
} else {
in[len2++] = s.top();
s.pop();
}
}
getPost(0, n-1, 0, n-1);
for(int i = 0; i<n; i++){
cout << post[i];
i != n-1 ? cout << " " : cout << "\n";
}
return 0;
}