push的结果符合先序遍历的结果 即根左右(顺序从小到大)
pop的结果符合中序遍历(左根右)
1.有两种做法
一,在建树的时候,直接push进根节点即可(即并不需要真正建造树,在左右子树递归完成后push进的就是符合左右根的后序遍历得结果)
二,真正意义上的构造一棵树,然后后序遍历这个树
2.在构造树的时候注意每个节点都需要new Node,刚开始我没注意,导致不会继续进行下去
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <stack>
#include <sstream>
using namespace std;
struct Node {
int data;
Node *lchild, *rchild;
Node () {
lchild = NULL;
rchild = NULL;
}
}*root ;
int n, cnt = 0, cur = 0;
vector<int> pre, In, ans;
stack<int> s;
//构造树
void createTree(Node* &R, int left, int right) {
if (left > right) return;
int rt = pre[cur];
cur++;
int Root;
for(int i = left; i <= right; i++) {
if (In[i] == rt) {//找寻根结点在中序遍历中的坐标
Root = i;
break;
}
}
R = new Node;
R->data = rt;
if(left != right) {
createTree(R->lchild, left, Root - 1);
createTree(R->rchild, Root+1, right);
}
ans.push_back(rt);
return;
}
void postPrint(Node *r) {
if (r == NULL) return;
postPrint(r->lchild);
postPrint(r->rchild);
if (cnt != 0) printf(" ");
cnt++;
printf("%d", r->data);
}
int main () {
scanf("%d", &n);
string s1;
int tmp;
for(int i = 0; i < n<<1; i++) {
cin >> s1;
if (s1 == "Push") {
cin >> tmp;
s.push(tmp);
pre.push_back(tmp);
} else {
In.push_back(s.top());
s.pop();
}
}
createTree(root, 0, n-1);
//postPrint(root);
int i;
for(i=0; i<ans.size()-1; i++) {
cout << ans[i] << " ";
}
cout << ans[i] << endl;
return 0;
}