PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree相关的知识,希望对你有一定的参考价值。
目录
整体思路
1.先根据后序和中序序列建树,老生常谈,记得返回root
2.对树进行BFS,在这个过程中用hash的方式记录下每个值对应的父节点、左孩子、右孩子的值,记录下深度(即层数),还有孩子的个数。
犯的错误
1. 根据后序和中序建树时,在中序中找父节点的位置
int i;
for(i=inL;i<=inR;i++){
if(inSeq[i]==root->v){
break;
}
}
for循环的条件又把声明了一遍int,导致下面直接用i,用的是0。
2. 读入每一句判断时
忘记cin遇到空格即停,应该用getline(cin,str)的
3. 在读入判断个数之后,需要加上cin.get();吸收末尾回车
剩余无需吸收末尾回车,getline(cin,str)能自己处理好,吸收了反而导致后面错读
4. 我把这里说的full binary tree和满二叉树混为一谈,这里是题目自己定义了一个树,就是孩子节点个数要不为0要不为2,而真正满二叉树的定义是每一层的结点个数都达到了该层可以达到的最大个数。
代码
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn = 31;
const int SUP = 1001;
int inSeq[maxn],postSeq[maxn];
int parent[SUP],lchild[SUP],rchild[SUP],layer[SUP],childNum[SUP] = {0};
struct Node{
int v;
Node* lchild;
Node* rchild;
};
void BFS(Node* root){
queue<Node*> Q;
Q.push(root);
layer[root->v] = 1;
while(!Q.empty()){
Node* now = Q.front();
Q.pop();
if(now->lchild!=NULL){
childNum[now->v] ++;
lchild[now->v] = now->lchild->v;
parent[now->lchild->v] = now->v;
layer[now->lchild->v] = layer[now->v]+1;
Q.push(now->lchild);
}
if(now->rchild!=NULL){
childNum[now->v] ++;
rchild[now->v] = now->rchild->v;
parent[now->rchild->v] = now->v;
layer[now->rchild->v] = layer[now->v]+1;
Q.push(now->rchild);
}
}
return;
}
Node* create(int inL,int inR,int poL,int poR){
if(poL>poR||inL>inR)return NULL;
Node* root = new Node;
root->v = postSeq[poR];
int i;
for(i=inL;i<=inR;i++){
if(inSeq[i]==root->v){
break;
}
}
int leftNum = i - inL;
root->lchild = create(inL,i-1,poL,poL+leftNum-1);
root->rchild = create(i+1,inR,poL+leftNum,poR-1);
return root;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&postSeq[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&inSeq[i]);
}
Node* root = create(0,n-1,0,n-1);
BFS(root);
int qnum;
scanf("%d",&qnum);
cin.get();
while(qnum--){
string str;
getline(cin,str);
if(str.find("root")!=string::npos){
int num;
sscanf(str.c_str(),"%d is the root",&num);
if(num==root->v)printf("Yes\\n");
else printf("No\\n");
}
if(str.find("siblings")!=string::npos){
int m1,m2;
sscanf(str.c_str(),"%d and %d are siblings",&m1,&m2);
if(parent[m1]==parent[m2])printf("Yes\\n");
else printf("No\\n");
}
if(str.find("parent")!=string::npos){
int n1,n2;
sscanf(str.c_str(),"%d is the parent of %d",&n1,&n2);
if(parent[n2]==n1)printf("Yes\\n");
else printf("No\\n");
}
if(str.find("left")!=string::npos){
int n1,n2;
sscanf(str.c_str(),"%d is the left child of %d",&n1,&n2);
if(lchild[n2]==n1)printf("Yes\\n");
else printf("No\\n");
}
if(str.find("right")!=string::npos){
int n1,n2;
sscanf(str.c_str(),"%d is the right child of %d",&n1,&n2);
if(rchild[n2]==n1)printf("Yes\\n");
else printf("No\\n");
}
if(str.find("same")!=string::npos){
int n1,n2;
sscanf(str.c_str(),"%d and %d are on the same level",&n1,&n2);
if(layer[n1]==layer[n2])printf("Yes\\n");
else printf("No\\n");
}
if(str.find("full")!=string::npos){
bool ans = true;
for(int i=0;i<n;i++){
int n = inSeq[i];
if(childNum[n]==1)ans = false;
}
if(ans)printf("Yes\\n");
else printf("No\\n");
}
}
return 0;
}
以上是关于PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree的主要内容,如果未能解决你的问题,请参考以下文章
PAT(甲级)2020年春季考试 7-4 Replacement Selection
PAT(甲级)2021年春季考试 7-4 Recycling of Shared Bicycles
PAT(甲级)2019年春季考试 7-2 Anniversary