【PAT甲级】1110 Complete Binary Tree (25分)
题意:
输入一个正整数N(<=20),代表结点个数(0~N-1),接着输入N行每行包括每个结点的左右子结点,'-'表示无该子结点,输出是否是一颗完全二叉树,是的话输出最后一个子结点否则输出根节点。
trick:
用char输入子结点没有考虑两位数的结点😓。。。
stoi(x)可以将x转化为十进制整数
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 bool vis[1007]; 5 int lchild[27],rchild[27]; 6 int num[27]; 7 int n; 8 int check(){ 9 memset(vis,0,sizeof(vis)); 10 for(int i=0;i<n;++i) 11 vis[num[i]]=1; 12 for(int i=1;i<=n;++i) 13 if(!vis[i]) 14 return 0; 15 return 1; 16 } 17 int main(){ 18 ios::sync_with_stdio(false); 19 cin.tie(NULL); 20 cout.tie(NULL); 21 cin>>n; 22 memset(lchild,-1,sizeof(lchild)); 23 memset(rchild,-1,sizeof(rchild)); 24 for(int i=0;i<n;++i){ 25 string x,y; 26 cin>>x>>y; 27 if(x!="-") 28 lchild[i]=stoi(x),vis[stoi(x)]=1; 29 if(y!="-") 30 rchild[i]=stoi(y),vis[stoi(y)]=1; 31 } 32 int root=0; 33 for(int i=0;i<n;++i) 34 if(!vis[i]) 35 root=i; 36 queue<int>q; 37 q.push(root); 38 int last=0; 39 num[root]=1; 40 while(!q.empty()){ 41 int now=q.front(); 42 last=now; 43 q.pop(); 44 if(lchild[now]!=-1){ 45 q.push(lchild[now]); 46 num[lchild[now]]=num[now]*2; 47 } 48 if(rchild[now]!=-1){ 49 q.push(rchild[now]); 50 num[rchild[now]]=num[now]*2+1; 51 } 52 } 53 if(check()==1) 54 cout<<"YES "<<last; 55 else 56 cout<<"NO "<<root; 57 return 0; 58 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)