1086 Tree Traversals Again (25分)
题目大意:给出栈模拟树的中序遍历过程,要求输出后序遍历。
tips:
- push的顺序就是树的先序遍历(因为每次都是按照根->左子树->右子树,且push都为当前根或子树的根结点);
- 根据push、pop的顺序模拟栈,可以得到中序遍历;
- 根据先序和中序遍历得到后序遍历结果:先序从前往后查找,
找到中序当中
与其相等的值
,根据该值的位置
将中序划分为左子树和右子树
,递归查找。
#include<iostream> //输入输出流头文件
#include<vector> //变长数组容器
#include<stack> //栈
#include<string> //C++string类
using namespace std; //标准命名空间
int n=0,j=0,k=-1,p=-1;
string d;
void postorder(int s,int e);
vector<int> pre,in,post;
int main(){ //主函数
cin>>n;
pre.resize(n);
stack<int> s;
for(int i=0;i<2*n;i++){
cin>>d ;
if(d=="Pop") {
in.push_back(s.top());
s.pop();
}
else {
cin>>pre[j];
s.push(pre[j++]);
}
}
postorder(0,n-1);
cout<<post[0];
for(int i=1;i<n;i++)cout<<' '<<post[i];
return 0; //返回0,如果不返回0,PAT会报错
}
void postorder(int s,int e){
if(s>e)return;
p++;
if(e==s) post.push_back(in[s]);
else{
int i=s;
while(i<=e&&in[i]!=pre[p]){i++;}
postorder(s,i-1);//左孩子
postorder(i+1,e);//右孩子
post.push_back(in[i]);//根
}
}