您的位置:首页 > 大数据 > 人工智能

1086. Tree Traversals Again (25)

2016-03-02 22:02 579 查看
    所有的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息