我在网上看过很多方法,都感觉不够简洁,对于初学者不好理解。
这个是上学期做的,非递归。
层次遍历找到二叉树第一个缺口,标记它应该在队列的位置,
遍历结束后比较它是否和队列的尾标相同来判断。(其实到这里如果接下来还有节点就可以结束了)
水平有限,希望和大家交流一下。
int Completree(BiTree p) //判断是否是完全二叉树
{
BiTree Q[maxsize];
BiTree t;
int f,r,flag,m;
flag=0;
f=0;
r=0;
if(p==NULL)
return 0;
Q[r++]=p;
while(f!=r)
{
t=Q[f++];
if(t->lchild)
{
if(r>=maxsize)
{
printf("overflow");
exit(0);
}
Q[r++]=t->lchild;
}
else if(flag==0)
{
m=r;
flag=1; //找到第一个叶子节点,记录它的标号。
}
if(t->rchild)
{
if(r>=maxsize)
{
printf("overflow");
exit(0);
}
Q[r++]=t->rchild;
}
else if(flag==0)
{
m=r;
flag=1;
}
}
if (m==r)
printf("这是一个完全二叉树\n"); //判断标记与队列尾标是否重合
else printf("这是一个非完全二叉树\n");
return 1;
}