1110. Complete Binary Tree (25)
Given a tree, you are supposed to tell if it is a complete binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=20) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N-1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.
Output Specification:
For each case, print in one line "YES" and the index of the last node if the tree is a complete binary tree, or "NO" and the index of the root if not. There must be exactly one space separating the word and the number.
Sample Input 1:9 7 8 - - - - - - 0 1 2 3 4 5 - - - -Sample Output 1:
YES 8Sample Input 2:
8 - - 4 5 0 6 - - 2 3 - 7 - - - -Sample Output 2:
NO 1
tips:这道题用到了堆的思想,左儿子的为父亲的二倍,右儿子为父亲的二倍+1;当出现一个节点的>n时,则不是完全二叉树,最为为n的点一定是最后一个结点
#include<iostream> #include<cstring> #include<string> using namespace std; const int maxn=200; int n,rt; int t[maxn][2]; int book[maxn]; int flag=1; void dfs(int x,int cnt) { if(!flag)return; if(cnt>n){ flag=0; return; } if(cnt==n)flag=x; if(t[x][0]!=-1)dfs(t[x][0],cnt*2); if(t[x][1]!=-1)dfs(t[x][1],cnt<<1|1); } int main() { cin>>n; for(int i=0;i<n;i++) { char a[4],aa[4]; scanf("%s %s",a,aa); if(a[0]=='-')t[i][0]=-1; else sscanf(a,"%d",&t[i][0]); if(aa[0]=='-')t[i][1]=-1; else sscanf(aa,"%d",&t[i][1]); book[t[i][0]]=book[t[i][1]]=1; } for(int i=0;i<n;i++)if(!book[i]){ rt=i;break; } dfs(rt,1); if(!flag)cout<<"NO"<<" "<<rt<<endl; else cout<<"YES"<<" "<<flag<<endl; return 0; }