PAT Advanced 1110 【Complete Binary Tree】(25)

分析:可由完全二叉树满足的编号关系入手,首先没出现在孩子的位置的结点是根节点,然后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;
}

猜你喜欢

转载自blog.csdn.net/gq__97/article/details/82056304