注意:这里采用的创建二叉树的方法,是输入先序序列,递归创建二叉树,要求输入的数字顺序是合理的先序,不然就没办法创建成功
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAXQSIZE 100
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;//左右子树根结点地址
}BiTNode, *BiTree;
typedef struct {
BiTree *base;
int front, rear;
}SqQueue;//定义循环队列
void CreateBiTree(BiTree &T)
{ int ch;
scanf("%d",&ch);
if (ch == -1) T = NULL;
else
{ T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InitQueue(SqQueue &Q)
{ Q.base = (BiTree *)malloc(MAXQSIZE * sizeof(BiTree));
Q.front = Q.rear = 0;
}
void EnQueue(SqQueue &Q, BiTree e)
{ if((Q.rear + 1) % MAXQSIZE == Q.front) return; //队满
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXQSIZE;;
}
void DeQueue(SqQueue &Q, BiTree &e)
{ if(Q.rear == Q.front) return; //队空
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;
}
int QueueEmpty(SqQueue Q)
{ if(Q.rear == Q.front) return 1;
else return 0;
}
//将所有结点(包括空节点)全部入队,遇到第一个孩子为空的节点则检查其后面是否还有非空的节点,有的话不是完全二叉树,没有则是完全二叉树
int IsComplete(BiTree T){
SqQueue Q;
InitQueue(Q);
BiTree p = (BiTNode*)malloc(sizeof(BiTNode));
p = T;
if(!p){
return 1; //空树是完全二叉树
}
EnQueue(Q, p); //入队
while(!QueueEmpty(Q)){
DeQueue(Q,p);
if(p){ //全部入队 遇到第一个空节点转到else
EnQueue(Q,p->lchild);
EnQueue(Q,p->rchild);
}else{ //遇到空节点时开始检查队列中是否满足完全二叉树
while(!QueueEmpty(Q)){
DeQueue(Q, p);
if(p){
return 0;
}
}
}
}
return 1; //是完全二叉树
}
int main() {
BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
CreateBiTree(T);
printf("\n是否是完全二叉树(1代表是,0代表否):");
int result = IsComplete(T);
printf("%d", result);
}