PAT A 1127 AC代码

这篇博客介绍了一种利用前序遍历(Preorder Traversal)和后序遍历(Postorder Traversal)数组构造二叉树,并按层序打印节点的方法。通过递归在构建过程中直接将节点分配到对应的层级数组,避免了额外的广度优先搜索(BFS)步骤。这种方法简化了复杂度,提高了效率。
摘要由CSDN通过智能技术生成

与层序遍历题异曲同工

使用vector数组 v[]记录每一层的树结点

pre递归遍历的时候标记此节点层数,在对应的vector中写入结点

(叫pre是因为改进中后转前,所以懒得改名字)

规避了建树再BFS

(思路启发自liuchuo学姐 但学姐的题解不是这个思路写的 我觉得这个思路简单很多 还是膜大佬)

#include<iostream>
#include<vector>
using namespace std;
vector<int> in,post;
vector<int> v[35];
void pre(int root,int level,int start,int end){
	if(start>end) return;
	int i=start;
	while(i<end&&post[root]!=in[i]) i++;
	v[level].push_back(post[root]);
	pre(root-end+i-1,level+1,start,i-1);
	pre(root-1,level+1,i+1,end);
}
int main(){
	int N;
	cin>>N;
	in.resize(N+1);
	post.resize(N+1);
	for(int i=1;i<=N;i++){
		scanf("%d",&in[i]);
	}
	for(int i=1;i<=N;i++){
		scanf("%d",&post[i]);
	}
	pre(N,0,1,N);
	printf("%d",v[0][0]);
	for(int i=1;i<35;i++){
		if(i%2==0){
			for(int j=v[i].size();j>0;j--){
				printf(" %d",v[i][j-1]);	
			}
		}else{
			for(int j=0;j<v[i].size();j++){
				printf(" %d",v[i][j]);
			}
		}
	}
	return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值