判断一棵树是否为完全二叉树的算法c语言,判断是否为完全二叉树

什么是二叉树(Binary Tree)

每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树包含三种特殊的二叉树,完全二叉树、完满二叉树和完美二叉树。

首先带大家了解一下完全二叉树、完满二叉树、完美二叉树定义和的区别。

完全二叉树定义(Complete Binary Tree):若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

1f5b36c96da86112e17c69f92ad46eca.png

完满二叉树定义(Full Binary Tree):一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。

2990b1bbb8a908fe2c2b6ae60b0c6cc7.png

完美二叉树(Perfect Binary Tree):除了叶子结点之外的每一个结点都有两个孩子结点。(只要你有孩子,你就必然是有两个孩子。)每一行都不需要被完全填充。

171465a2994e189fe848ce5a0a130ebe.png

bool Judge_Complete(BiTree T)//判断二叉树是否是完全二叉树

{

BiTree t;

SqQueue Q;//创建一个空队列

InitQueue(Q);

EnQueue(Q,T); //将T的头结点入队

t = T;//给t赋初值T根节点

if(T==NULL)

return false;

while(QueueLength(Q))

{

if(t->lchild==NULL && t->rchild!=NULL)//如果左孩子为空右孩子不为空,说明一定不是完全二叉树

return false;

if(t->lchild!=NULL && t->rchild!=NULL)//左右孩子都不为空

{

DeQueue(Q,t);//删除该双亲节点

EnQueue(Q,t->lchild); //将左孩子入队

EnQueue(Q,t->rchild); //将右孩子入队

}

//如果左孩子不为空右孩子为空,或者左右孩子都为空(该节点为叶子结点)

//则该节点之后的所有节点都应该是叶子结点

if((t->lchild!=NULL && t->rchild==NULL) || (t->lchild==NULL && t->rchild==NULL))

{

DeQueue(Q,t); //从刚才判断的节点的下一个节点一次判断剩下队列中的节点是否左右子树都为空

while(QueueLength(Q))

{

if(t->lchild==NULL && t->rchild==NULL)

DeQueue(Q,t);

else

return false;

}

return true;

}

}

return true;

}

下面解释一下该算法的执行步骤:

1>如果树为空,则直接返回错。

2>如果树不为空:层次遍历二叉树 ;

2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;

2.2>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;

2.3>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;               该树才是完全二叉树,否则就不是完全二叉树。

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值