所有的Push组成前序遍历,pop出来的顺序为中序遍历,转化为知道前序与中序,求后序遍历的问题
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
struct Node{
int val;
Node* left;
Node* right;
Node(int v) : val(v), left(nullptr), right(nullptr){}
};
template<typename Iter>
Node* build(Iter preBegin, Iter preEnd, Iter inBegin, Iter inEnd){
if(preBegin == preEnd) return nullptr;
if(inBegin == inEnd) return nullptr;
int val = *preBegin;
Node* root = new Node(val);
Iter pos;
for(pos = inBegin; pos != inEnd; ++pos){
if(*pos == val) break;
}
int leftSize = distance(inBegin, pos);
root->left = build(next(preBegin), next(preBegin, leftSize+1), inBegin, pos);
root->right = build(next(preBegin, leftSize+1), preEnd, next(pos), inEnd);
return root;
}
void postTranversal(Node* root, vector<int>& post){
if(root == nullptr) return;
postTranversal(root->left, post);
postTranversal(root->right, post);
post.push_back(root->val);
}
int main(){
int n;
cin >> n;
vector<int> preorder;
vector<int> inorder;
stack<int> Q;
for(int i = 0; i < 2*n; ++i){
string op;
cin >> op;
if(op == "Push"){
int num;
cin >> num;
Q.push(num);
preorder.push_back(num);
}else{
inorder.push_back(Q.top());
Q.pop();
}
}
Node* root = build(begin(preorder), end(preorder), begin(inorder), end(inorder));
vector<int> result;
postTranversal(root, result);
for(size_t i = 0; i < result.size(); ++i){
if(i) printf(" ");
printf("%d", result[i]);
}
return 0;
}