【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
 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;ii)
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;ii){
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;ii)
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 }

 

你可能感兴趣的:(【PAT甲级】1110 Complete Binary Tree (25分))