您的位置:首页 > 编程语言 > C语言/C++

PAT-A-1086 Tree Traversals Again (25 分)二叉树先中序转后序 C++题解

2019-09-01 16:42 489 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/jal517486222/article/details/100184739

1086 Tree Traversals Again (25 分)

题目传送门:1086 Tree Traversals Again (25 分)

一、题目大意

这道题的难点就在于是否能读懂题意了。。。题目说的神乎其神,看似在用栈模拟二叉树的构造,以一种压栈顺序,出栈的顺序就是中序。仔细研究下发现入栈顺序是二叉树的先序(题目好像没说明是先序入栈,只说按1-n入栈),而出栈顺序是中序。那么既然有了先中序,想获得后序就so easy了

二、解题思路

常规套路,二叉树先中序转后序,直接看代码吧

三、AC代码

#include<bits/stdc++.h>
using namespace std;
vector<int>preorder, inorder, postorder;
map<int, int>M;
void dfs(int preLeft, int preRight, int inLeft, int inRight){
if(preLeft > preRight)return;
int val = preorder[preLeft];
int p = inLeft;
for(int i = inLeft; i <= inRight; i++){
if(inorder[i] == val){
p = i;
break;
}
}
int len = p - inLeft;
dfs(preLeft+1, preLeft+len, inLeft, p-1);
dfs(preLeft+len+1, preRight, p+1, inRight);
postorder.push_back(val);
}
int main(){
int n;
cin >> n;
stack<int>Stk;
for(int i = 0; i < 2*n; i++){
string s;
cin >> s;
if(s == "Push"){
int x;
cin >> x;
preorder.push_back(x);
Stk.push(x);
}else{
inorder.push_back(Stk.top());
Stk.pop();
}
}
assert(preorder.size() == inorder.size());
dfs(0, preorder.size()-1, 0, inorder.size()-1);
for(int i = 0; i < postorder.size(); i++){
if(i)cout << " " << postorder[i];
else cout << postorder[i];
}
cout << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: