分析:可由完全二叉树满足的编号关系入手,首先没出现在孩子的位置的结点是根节点,然后bfs进行遍历,对所有节点按完全二叉树进行编号,如根节点编号为0,其对应左孩子和右孩子的编号对应为0*2+1、0*2+2,即1和2。如果0到n之间有数字没被编号,则这不是一颗完全二叉树。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct Node{
int id, l, r;
}node[23];
int vis[23], id[23];
int str2num(string str){
int sum = 0;
for(int i = 0; i<str.length(); i++){
sum = sum*10+str[i]-'0';
}
return sum;
}
int getroot(int n){
for(int i = 0; i<n; i++){
if(!vis[i]) return i;
}
return -1;
}
void bfs(int root, int n){
queue<int> q;
q.push(root);
node[root].id = 0;
memset(vis, 0, sizeof vis);
int cur;
while(!q.empty()){
cur = q.front();
q.pop();
id[node[cur].id] = 1;
if(node[cur].l != -1){
node[node[cur].l].id = node[cur].id*2+1;
q.push(node[cur].l);
}
if(node[cur].r != -1){
node[node[cur].r].id = node[cur].id*2+2;
q.push(node[cur].r);
}
}
for(int i = 0; i<n; i++){
if(!id[i]){
cout << "NO " << root << '\n';
return ;
}
}
cout << "YES " << cur << '\n';
}
int main(){
//freopen("aa.txt", "r", stdin);
int n;
string l, r;
cin >> n;
for(int i = 0; i<n; i++){
cin >> l >> r;
node[i].l = node[i].r = -1;
if(l != "-"){
node[i].l = str2num(l);
vis[node[i].l] = 1;
}
if(r != "-"){
node[i].r = str2num(r);
vis[node[i].r] = 1;
}
}
int root = getroot(n);
bfs(root, n);
return 0;
}