PAT A 2019春 7-4 Structure of a Binary Tree AC代码

一开始看到题目的时候有点懵,这个输入有点让人头大

按照种类不断细分来写,对于每个输入一个一个词读取判断

还有就是根据后序和中序建树,为方便判断结构体多存一点信息

我根据后序的顺序对每个数字编号,用了一个map记录对应关系

 

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int N,M;
vector<int> post,in;
struct node{
	int num,pa,lc,rc,le;
}Node[31];
unordered_map<int,int> num_index;
int tree(int root,int start,int end,int pa,int level){
	if(start>end) return -1;
	int index=post[root];
	int i=start;
	while(in[i]!=index) i++;
	Node[root].pa=pa;
	Node[root].le=level;
	Node[root].rc=tree(root-1,i+1,end,root,level+1);
	Node[root].lc=tree(root-end+i-1,start,i-1,root,level+1);
	return root;
}
int main(){
	cin>>N;
	post.resize(N+1);
	in.resize(N+1);
	int index_num[N+1];
	for(int i=1;i<=N;i++){
		scanf("%d",&post[i]);
		Node[i].num=post[i];
		num_index[post[i]]=i;
	}
	for(int i=1;i<=N;i++){
		scanf("%d",&in[i]);
	}
	tree(N,1,N,0,0);
	cin>>M;
	for(int i=0;i<M;i++){
		int A,B;
		string s;
		cin>>s;
		if(s[0]>='0'&&s[0]<='9'){
			A=stoi(s);
			cin>>s;
			if(s=="is"){
				cin>>s;cin>>s;
				if(s=="root"){ //A is the root
					if(A==post[N]){
						printf("Yes\n");
					}else{
						printf("No\n");
					}
				}else if(s=="parent"){ //A is the parent of B
					cin>>s;cin>>s;
					B=stoi(s);
					if(Node[num_index[B]].pa==num_index[A]){
						printf("Yes\n");
					}else{
						printf("No\n");
					}
				}else if(s=="left"){//A is the left child of B
					cin>>s;cin>>s;cin>>s;
					B=stoi(s);
					if(Node[num_index[B]].lc==num_index[A]){
						printf("Yes\n");
					}else{
						printf("No\n");
					}
				}else if(s=="right"){//A is the right child of B
					cin>>s;cin>>s;cin>>s;
					B=stoi(s);
					if(Node[num_index[B]].rc==num_index[A]){
						printf("Yes\n");
					}else{
						printf("No\n");
					}
				}
			}else{
				cin>>s;
				B=stoi(s);
				cin>>s;cin>>s;
				if(s=="siblings"){ //A and B are siblings
					if(Node[num_index[A]].pa==Node[num_index[B]].pa){
						printf("Yes\n");
					}else{
						printf("No\n");
					}
				}else{ //A and B are on the same level
					cin>>s;cin>>s;cin>>s;
					if(Node[num_index[A]].le==Node[num_index[B]].le){
						printf("Yes\n");
					}else{
						printf("No\n");
					}
				}
			}
		}else{  //It is a full tree 
			cin>>s;cin>>s;cin>>s;cin>>s;
			bool flag=true;
			for(int j=1;j<=N;j++){
				if((Node[j].lc==-1&&Node[j].rc!=-1)||(Node[j].lc!=-1&&Node[j].rc==-1)){
					flag=false;
				}
			}
			if(flag){
				printf("Yes\n");
			}else{
				printf("No\n");
			}
		}
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值