PAT(Advance)1110.Complete Binary Tree
该题分制为25分。
题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805359372255232
题目给出一颗树的所有节点,及其左右孩子信息,判断是否为完全二叉树。因为时完全二叉树,所以它的节点可以用数组存储。若父节点数组下标为i,左孩子的数组下标为2i,左孩子的数组下标为2i+1,所以数组的前1~n个空间一定能存满n个节点的完全二叉树。若其中有为空的说明该数不是完全二叉树。数组存储可以用层序遍历来存。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int>v[25];
queue<int>q;
int tree[100];
bool vis[25] = { false };
int n, root=0, lastnode=0;
void BFS()
{
int index = 1;
tree[1] = root;
while (!q.empty())
{
lastnode = q.front();
q.pop();
tree[2 * index ] = v[lastnode][0];
tree[2 * index + 1] = v[lastnode][1];
index++;
if (v[lastnode][0] != -1)
{
q.push(v[lastnode][0]);
}
if (v[lastnode][1] != -1)
{
q.push(v[lastnode][1]);
}
}
}
int str2int(string s)
{
int sum = 0;
for (auto t = s.begin(); t != s.end(); t++)
{
sum = sum * 10 + *t-'0';
}
return sum;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
string s1, s2;
cin >> s1 >> s2;
if (s1 != "-")
{
int x = str2int(s1);
v[i].push_back(x);
vis[x] = true;
}
else
{
v[i].push_back(-1);
}
if (s2 != "-")
{
int x = str2int(s2);
v[i].push_back(x);
vis[x] = true;
}
else
{
v[i].push_back(-1);
}
}
for (int i = 0; i < n; i++)
{
if (!vis[i])
{
root = i;
break;
}
}
q.push(root);
BFS();
bool flag = true;
for (int i = 1; i <= n; i++)
{
if (tree[i] == -1)
{
flag = false;
break;
}
}
if (flag)
{
cout << "YES " << lastnode;
}
else
{
cout << "NO " << root;
}
return 0;
}