思路:利用层序遍历判断是否是一棵完全二叉树,给的下标同样利用二叉树的静态写法
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<string>
using namespace std;
const int maxn = 21;
int n, last;
struct node
{
int lchild, rchild;
}Node[maxn];
bool notroot[maxn];
int input(string s)
{
if (s[0] == '-')
return -1;
else
{
if (s.size() == 1)
{
notroot[s[0] - '0'] = true;
return s[0] - '0';
}
else
{
notroot[(s[0] - '0') * 10 + (s[1] - '0')] = true;
return (s[0] - '0') * 10 + (s[1] - '0');
}
}
}
int findroot()
{
for (int i = 0; i < n; i++)
{
if (notroot[i] == false)
return i;
}
}
bool bfs(int root)
{
queue<int>q;
q.push(root);
while (n)
{
int temp = q.front();
q.pop();
if (temp == -1)
return false;
n--;
last = temp;
q.push(Node[temp].lchild);
q.push(Node[temp].rchild);
}
return true;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
string s1, s2;
cin >> s1 >> s2;
Node[i].lchild = input(s1);
Node[i].rchild = input(s2);
}
int root = findroot();
int a = bfs(root);
if (a)
{
cout << "YES " << last << endl;
}
else
{
cout << "NO " << root << endl;
}
}