题目来源:严蔚敏《数据结构》C语言版本习题册 6.49
// 6.49 编写算法判别给定二叉树是否为完全二叉树
Status BiTreeIsComplete(BiTree T) {
// 思路:完全二叉树的层次遍历应该是没有NULL的
// 实现:把所有的结点都入队列,包括空指针
BiTNode *queue[maxSize], *p;
int front,rear;
int flag=0;
front=rear=0;
queue[rear]=T;rear=(rear+1)%maxSize; //入队列
while (front!=rear) { //队列不为空
p=queue[front];front=(front+1)%maxSize; //出队列
if (!p) flag=1; //出现了空指针
else if (flag) return ERROR; //出现了一个非空结点,但前面已经扫描到了空指针,不是完全二叉树
else { //不管是不是空,都入队列
queue[rear]=p->lchild;rear=(rear+1)%maxSize;
queue[rear]=p->rchild;rear=(rear+1)%maxSize;
}
}
return TRUE;
}
// 是否为满二叉树
Status IsTwoN(int num) {
if ( (num&(num-1)) ) //去掉一个1,判断是否为0
return ERROR;
return TRUE;
}
Status BiTreeIsFull(BiTree T) {
// 先判断是否为完全二叉树
// 在上一步的时候得到结点的个数sum,sum=2^n-1 --> 根据这个公式:判断sum+1是不是2的次方即可
int sum=0;
BiTNode *queue[maxSize], *p;
int front,rear;
int flag=0;
// 判断是否为完全二叉树
front=rear=0;
queue[rear]=T;rear=(rear+1)%maxSize;
while (front!=rear) {
p=queue[front];front=(front+1)%maxSize;
if (!p) flag=1; //层次遍历出现了空
else if (flag) return ERROR; //出现了一个非空结点,但前面已经扫描到了空指针,不是完全二叉树
else { //空指针也入队
sum++; //计算结点的个数
queue[rear]=p->lchild;rear=(rear+1)%maxSize;
queue[rear]=p->rchild;rear=(rear+1)%maxSize;
}
}
// 为完全二叉树
printf("结点总数为:%d\n", sum);
return IsTwoN(sum+1);
}