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;
}
#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;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性