利用层序遍历来判断
如果-1提前出现了,则说明为非完全二叉树。
注意使用atoi把字符数组型数字转换为整形的数。
在C++中使用stoi也是相同功能。

#include<cstdio>
#include<vector> 
#include<queue>
#include<iostream>
using namespace std;
const int maxn=25;
int n;
int father[maxn];
vector<int> G[maxn];
int main(){
	scanf("%d",&n);
	
	for(int i=0;i<n;i++){
		father[i]=-1;
	}
	
	for(int i=0;i<n;i++){
		char l[3],r[3];
		scanf("%s %s",l,r);
		int k;
		if(l[0]!='-') {
			k=atoi(l);
			G[i].push_back(k);
			father[k]=i;
		}
		else G[i].push_back(-1);
		
		if(r[0]!='-') {
			k=atoi(r);
			G[i].push_back(k);
			father[k]=i;
		}
		else G[i].push_back(-1);	
	}
	//找根 
	int root;
	for(int i=0;i<n;i++){
		if(father[i]==-1){
			root = i;
			break;
		}
	}
	//层序遍历
	queue<int> q;
	q.push(root);
	int cnt=0,lastnode;
	while(!q.empty()){
		int temp = q.front();
		q.pop();
		if(temp != -1){
			cnt++;
			lastnode = temp;
		}else{
			if(cnt != n) printf("NO %d\n",root);
			else printf("YES %d\n",lastnode);
			break;
		}
		q.push(G[temp][0]);
		q.push(G[temp][1]);
	} 
	return 0;
}