满二叉树一定是完全二叉树,完全二叉树不一定为满二叉树.
所谓完全二叉树就是除最后一层和次最后一层可以存在叶子节点其余的必须为满二叉树,且结点要靠左,即左子树优先.
判断是否为完全二叉树 即可以直接对所给定的节点之间的关系进行层次遍历,遍历过程中记录结点个数,当找到一个没有孩子结点的结点时判断是否遍历了N个结点即可.、
#include<bits/stdc++.h>
using namespace std;
const int maxn = 30;
int n;
struct node
{
int l,r,f;
}a[maxn];
int getnum(char *s)
{
int len = strlen(s);
int num = 0;
for(int i = 0;i < len;++i)
num = num * 10 + s[i] - '0';
return num;
}
void bfs()
{
queue<int>Q;
while(!Q.empty())
Q.pop();
int rot = -1;
for(int i = 0;i < n;++i)
if(a[i].f == -1)
{
rot = i;
break;
}
Q.push(rot);
int num = 1,cur;
while(!Q.empty())
{
cur = Q.front();
Q.pop();
int l = a[cur].l , r= a[cur].r;
if(l == -1)
break;
num++;
Q.push(l);
if(r == -1)
break;
num++;
Q.push(r);
}
while(!Q.empty())
{
cur = Q.front();
Q.pop();
}
if(num == n)
printf("YES %d\n",cur);
else
printf("NO %d\n",rot);
return ;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 0;i <= n;++i)
a[i].f = -1;
for(int i = 0;i < n;++i)
{
char s1[5],s2[5];
scanf("%s %s",s1,s2);
if(s1[0] == '-')
a[i].l = -1;
else
a[i].l = getnum(s1),a[a[i].l].f = i;
if(s2[0] == '-')
a[i].r = -1;
else
a[i].r = getnum(s2),a[a[i].r].f = i;
}
bfs();
}
return 0;
}