PAT甲级 1086 Tree Traversals Again (25分) 先序中序转后序/C++

1086 Tree Traversals Again (25分)

题目大意:给出栈模拟树的中序遍历过程,要求输出后序遍历。

tips:

  1. push的顺序就是树的先序遍历(因为每次都是按照根->左子树->右子树,且push都为当前根或子树的根结点);
  2. 根据push、pop的顺序模拟栈,可以得到中序遍历;
  3. 根据先序和中序遍历得到后序遍历结果:先序从前往后查找,找到中序当中与其相等的值,根据该值的位置将中序划分为左子树和右子树,递归查找。
#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]);//根
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值