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 8
Sample Input 2:
8
4 5
0 6
2 3
- 7
-
-
Sample Output 2:
NO 1
题目大意
判断一棵树是不是完全二叉树
知识点
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=30;
int n;
int l[maxn],r[maxn];
bool hasfather[maxn];
int max_pos,last_u;
void dfs(int u,int pos){
// cout<<"u=="<<u<<"pos=="<<pos<<endl;
if(pos>max_pos){
max_pos=pos;
last_u=u;
}
if(l[u]!=-1) dfs(l[u],pos*2);
if(r[u]!=-1) dfs(r[u],pos*2+1);
}
int main(){
cin>>n;
memset(l,-1,sizeof l);
memset(r,-1,sizeof r);
for(int i=0;i<n;i++){
string a,b;
cin>>a>>b;
if(a!="-") l[i]=stoi(a),hasfather[stoi(a)]=true;
if(b!="-") r[i]=stoi(b),hasfather[stoi(b)]=true;
}
// for(int i=0;i<n;i++) cout<<l[i]<<" "; cout<<endl;
// for(int i=0;i<n;i++) cout<<r[i]<<" "; cout<<endl;
int root=0;
while(hasfather[root]) root++;
dfs(root,1);
// cout<<"mx=="<<max_pos<<endl;
if(max_pos>n){
cout<<"NO "<<root;
}else{
cout<<"YES "<<last_u;
}
return 0;
}```