PAT-A1127

前几天去刷了PAT,趁热把答案记录下来供大家参考

这题完全是英语阅读题,题目读懂就能写

题意:BST,给中序序列和后序序列,重建这颗树,并将树按"Z"字型输出



#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
int n;
int in[40], post[40];
struct node{
	int data;
	int level;
	node* left;
	node* right;
	node():left(NULL),right(NULL){}
};

node* creat(int inL, int inR, int postL, int postR){
	if(inL>inR)return NULL;
	node* root=new node;
	root->data=post[postR];
	int k;
	for(k=inL;k<=inR;k++){
		if(in[k]==post[postR])break;
	}
	int num_left=k-inL;
	root->left=creat(inL,k-1,postL,postL+num_left-1);
	root->right=creat(k+1,inR,postL+num_left,postR-1);
	return root;
}
int max_level=0;
vector<int> ve[40];
void BFS(node* root){
	queue<node*> q;
	root->level=1;
	q.push(root);
	while(!q.empty()){
		node* front=q.front();
		q.pop();
		ve[front->level].push_back(front->data);
		if(front->level>max_level)max_level=front->level;
		if(front->left!=NULL){
			front->left->level=front->level+1;
			q.push(front->left);
		}
		if(front->right!=NULL){
			front->right->level=front->level+1;
			q.push(front->right);
		}
	}
}
int main(){
int i, j, total=0;
scanf("%d",&n);
for(i=0;i<n;i++){
	scanf("%d",&in[i]);
}
for(i=0;i<n;i++){
	scanf("%d",&post[i]);
}
node* root=creat(0,n-1,0,n-1);
BFS(root);
for(i=1;i<=max_level;i++){
	if(i==1||i%2==0){
		for(j=0;j<ve[i].size();j++){
			printf("%d",ve[i][j]);
			total++;
			if(total<n)printf(" ");
		}
	}
	else{
		for(j=ve[i].size()-1;j>=0;j--){
			printf("%d",ve[i][j]);
			total++;
			if(total<n)printf(" ");
		}
	}
}
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值