方法1:只需对n个结点的树从root开始从1编号,若编到最后一个点时编号为n,即等于树的结点的个数,则为完全二叉树。反之则不是完全二叉树。
方法2:进行层序遍历的bfs,设置变量after=0,如果访问到空结点时,则将after置1。
if (u->left != NULL) {
if (after) isComplete = 0; //若发现已经出现过空结点后又出现了非空结点,那么一定不是完全二叉树
q.push(u->left);
} else {
after=1; //一旦访问到空结点,立即将after置1
}
if (u->right!=NULL) {
if (after) isComplete = 0; //同上
q.push(u->right);
} else {
after=1;
}
#include<bits/stdc++.h>
using namespace std;
struct node{
int l;
int r;
}q[1005];
int n;
int vis[1005];
int maxx=-1,t_root;
void dfs(int root,int index) //index用于对结点编号
{
if(index>maxx)
{
maxx=index;
t_root=root;
}
if(q[root].l!=-1)
dfs(q[root].l,index*2);
if(q[root].r!=-1)
dfs(q[root].r,index*2+1);
}
int solve(string a) //将字符串转为整型
{
int sum=0;
for(int i=0;i<a.length();i++)
sum=sum*10+a[i]-'0';
return sum;
}
int main()
{
cin>>n;
string a,b;
for(int i=0;i<n;i++)
{
cin>>a>>b;
if(a!="-")
{
q[i].l=solve(a);
vis[q[i].l]=1;
}
else
q[i].l=-1;
if(b!="-")
{
q[i].r=solve(b);
vis[q[i].r]=1;
}
else
q[i].r=-1;
}
int root;
for(int i=0;i<n;i++)
{
if(vis[i]==0)
root=i;
}
dfs(root,1);
if(maxx==n) //如果最后编号正确则为完全二叉树
cout<<"YES "<<t_root<<endl;
else
cout<<"NO "<<root<<endl;
return 0;
}