一开始看到题目的时候有点懵,这个输入有点让人头大
按照种类不断细分来写,对于每个输入一个一个词读取判断
还有就是根据后序和中序建树,为方便判断结构体多存一点信息
我根据后序的顺序对每个数字编号,用了一个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;
}