利用层序遍历来判断
如果-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;
}