PAT 甲级 1110 Complete Binary Tree (25 分)

思路:

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;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12309006.html