完全二叉树
深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中的编号为1~n的结点相对应,则这个二叉树为完全二叉树.
满二叉树
深度为k 且有2^k-1个结点的二叉树. 结点的编号约定为:从根结点起从上至下,自左向右地顺序编号.
判断完全二叉树的充分必要条件
(1)如果一棵完全二叉树的深度为k,那么在第k-1层中的结点中,
(a)一旦有一个结点的右孩子为空,则同层中后继编号结点的左右孩子都为空;
(b)一旦有一个结点的左孩子为空,则该结点的右孩子,以及同层中后继编号结点的左右孩子都为空。
(2)如果一棵完全二叉树的深度为k,则第1层~第k-2层的结点都必须既有左孩子又有右孩子,即第1层~第k-1层中的所有结点构成一棵满二叉树。
程序如下:
#inclue"stdio.h"
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,BiTree;
//创建一棵二叉树
/*level1用来记录二叉树的深度,level2始终记录的是当前访问的结点在二叉树中的深度,由于level1是要返回的参数,作为justicBTree()的一个参数,所以要用指针传递的方法作为参数进行传递。*/
CreatBiTree(BiTree *T,int *level1,int level2)
{
char c;
scanf("%c",&c);
if(c==' ') *T=NULL;
else {
*T=(BiTNode *)malloc(sizeof(BiTNode));
(*T)->data=c;
if(*level1<level2)
{
*level1=level2;
}
CreatBiTree(&((*T)->lchild),&(*level1),level2+1);
CreatBiTree(&((*T)->rchild),&(*level1),level2+1);
}
/* 判断是否为完全二叉树*/
/*是:返回1*/
/*不是:返回0;*/
/*T为根结点指针,level为当前访问的结点所在的层数,n为k-1,其中k为二叉树的深度,flag为一个标志变量,用来记录第k-1层的结点的右孩子是否为空*/
int justicCompleteBiTree(BiTree T,int level,int n,int flag)
{
if(!T) return 1;
if(level==n)
{
if(T->lchild==NULL&&T->rchild!=NULL) return 0;
if(*flag==0)
{
if(T->lchild==NULL) *flag=1;
}
else if(*flag==1)
{
if(T->lchild!=NULL||T->rchild!=NULL)
return 0;
}
}
if(level!=n&&level!=n+1)
{
if(T->lchild==NULL||T->rchild==NULL) return 0;
}
if(!justicCompleteBiTree(T->lchild,level+1,n,flag)) return 0;
if(!justicCompleteBiTree(T->rchild,level+1,n,flag)) return 0;
return 1;
}
main()
{
BiTree T;
int flag=0;
int level1=0;
printf("Please type some character to creat a binary tree\n ");
CreatBiTree(&T,&level1,0); //创建一棵二叉树,返回深度
if(justicCompleteBiTree(T,0,level1-1,&flag))
printf("It is a complete binary tree");
else
printf("It is not a complete binary tree");
getche();
}