思路:
1.首先设定root等于1+2+…+n,即(n-1)*n/2,然后每输入一个孩子,如果它不是空的,就减去相应值,最后就会得到根节点;
2.用vector<int,pair<int,int>>
存储每个结点的状态,孩子为空设值为-1;
3.利用队列层次遍历二叉树,同时在循环外用值记录当前遍历到的结点,因为最后可能会输出最后遍历到的结点;
4.如果遍历到孩子为空的情况,接下来的遍历如果有孩子不为空的情况,那么这棵树就不是完全二叉树;
代码:
#include<iostream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
vector<pair<int,int>> v;
int main(){
int n,find=false,flag=true,val;
cin>>n;
int root=n*(n-1)/2;
v.resize(n);
for(int i=0;i<n;i++){
string a,b;
cin>>a>>b;
v[i].first=(a!="-"?stoi(a):-1);
v[i].second=(b!="-"?stoi(b):-1);
if(~v[i].first) root-=v[i].first;
if(~v[i].second) root-=v[i].second;
}
queue<int> q;
q.push(root);
while(!q.empty()&&flag){
val=q.front();
if(~v[val].first){
q.push(v[val].first);
if(find) flag=false;
}
else if(!find) find=true;
if(~v[val].second){
q.push(v[val].second);
if(find) flag=false;
}
else if(!find) find=true;
q.pop();
}
if(flag) printf("YES %d",val);
else printf("NO %d",root);
return 0;
}