1. 题目要求
给定输入的树,判断是否为完全二叉树。
2. 代码
2.1 队列
typedef struct qu
{
int front;
int rear;
T *array[MAXSIZE];
} Q; //循环数组队列
void InitQ (Q *qu); //初始化队列
int EmptyQ (Q *qu); //判断队列是否空
int FullQ (Q *qu); //判断队列是否满
void EnQ (Q *qu, T *pd); //入队
T *DeQ (Q *qu); //出队
2.2 结构体和函数声明
//#define MAXSIZE
typedef struct tr
{
int data;
struct tr *lchild;
struct tr *rchild;
} T;
T *CreateT();
int Complete(T *r, Q *qu);
2.3 主函数
void main()
{
Q qu;
InitQ (&qu);
T *r=CreateT();
int flag=Complete(r, &qu);
if(flag==0)
printf("不是完全二叉树 \n");
else if(flag==1)
printf("是完全二叉树 \n");
}
2.4 建立二叉树
T *CreateT()
{
T *p;
scanf(结点数据);
getchar();
if(数据==-1) //完毕
return NULL;
else
{
p=(T *)malloc(sizeof(T));
p->data=数据;
printf("输入%d左子树\n", 数据);
p->lchild=CreateT();
printf("输入%d右子树\n", 数据);
p->rchild=CreateT();
return p;
}
}
2.5 判断
明确:任意节点不可能出现左子树不存在而右子树存在的情况。
对于只存在左子树的节点,其左子树必为叶节点,即无左子树和右子树。因此若存在左子树的左子树或右子树,则必定不是完全二叉树。
int Complete(T *r, Q *qu)
{
T *p=r;
int flag=0;
if(r!=NULL)
{
EnQ (qu, p);
while(EmptyQ (qu)!=1)
{
p=DeQ (qu);
if(flag==1)
{
if(p->lchild!=NULL || p->rchild!=NULL)
return 0;
}
else
{
if(p->rchild!=NULL && p->lchild==NULL)
return 0;
else if(p->lchild!=NULL && p->rchild==NULL)
{
if(p->lchild->lchild!=NULL || p->lchild->rchild!=NULL)
return 0;
EnQ(qu, p->lchild);
flag=1;
}
else if(p->lchild!=NULL && p->rchild!=NULL)
{
EnQ(qu, p->lchild);
EnQ(qu, p->rchild);
}
else
flag=1;
}
}
}
return 1;
}