判断完全二叉树

完全二叉树

深度为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为当前访问的结点所在的层数,nk-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();
}   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值