设计一个算法,判断一个二叉树是否为完全二叉树

原创 2015年07月08日 01:26:23

思想:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求:

某节点没有左孩子,则一定无右孩子

若某节点缺左或右孩子,则其所有后继一定无孩子

若不满足上述任何一条,均不为完全二叉树。

算法思路:采用层序遍历算法,用cm变量值表示迄今为止二叉树为完全二叉树(其初值为1,一旦发现不满足上述条件之一,则置cm为0),bj变量值表示迄今为止所有节点均有左右孩子(其初值为1),一旦发现一个节点没有左孩子或没有右孩子时置bj为0),在遍历完毕后返回cm的值。

对应的算法如下:

int CompBTNode(BTNode * b)

{

BTNode *Qu[MaxSize],*p; //定义一个队列,用于层次遍历

int front=0,rear=0; //队头、队尾指针

int cm=1;

int bj=1;

if(b!=NULL)

{

rear++;

Qu[rear]=b; //进队

while(front!=rear)

{

front++;

p=Qu[front];

if(p->lchild==NULL) //*p节点没有左孩子

{

bj=0;

if(p->rchild!=NULL) //没有左孩子但有右孩子

cm=0; //则不是完全二叉树

}

else //*p节点有左子树

{

if(bj==1) //迄今为止,所有节点均有左右孩子

{

rear++; //左孩子进队

Qu[rear]=b->lchild;

if(p->rchild==NULL) //*p有左孩子但没有右孩子

bj=0;

else

{

rear++; //右孩子进队

Qu[rear]=p->rchild;

}

else //bj=0:迄今为止,已有节点缺孩子

cm=0; //而此时*p节点有左孩子,违反(2)

}

}

return cm;

}

return 1; //把空树当成特殊的完全二叉树

}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

判断一个树为完全二叉树

完全二叉树 该节点有左子树,可以没有有子树,但如果有右子树,就必须有左子树这里我们可以用层序遍历的思想,借助一个队列,队列保存的是Node*,将该节点入队列,出队列的同时将下一层自己的左右节点入队列...

编程判断一个树是完全二叉树(使用层次遍历实现)

完全二叉树:一棵具有N个节点的二叉树的结构与满二叉树的前N个节点的结构相同 如何判断一个树是完全二叉树 可以使用层序遍历,只需2个步骤 第一步:如果遍历到一个节点只有右子树没有左...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

有关完全二叉树求节点数和前缀树求字符串是否重复的两道算法题

有关求完全二叉树的节点数和用前缀树求字符串是否重复的两道算法题总结

~判断一棵树是否是完全二叉树~

判断一棵树是否是完全二叉树

判断一棵树是否是完全二叉树

【题目】 有一棵二叉树,请设计一个算法判断它是否是完全二叉树。 给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。 【分析】完全二叉树树...

判断一棵树是否为完全二叉树

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

判断一棵树是否是完全二叉树

这道题可以看作是层序遍历的变形。在二叉树的层序遍历中,我们借助一个数据结构队列,根据其先进先出的性质,实现层序遍历。可以定义一个flag标志位,一旦遇到空节点,标志位生效。

【Java实现】判断一棵树是否为BST,一棵树是否为完全二叉树

给定一个二叉树,判断它是不是二叉搜索树。 思路:对于一棵二叉树,最简单的方法就是中序遍历,看是不是一个递增数列,如果是,则是一棵二叉搜索树,如果不是,则不是二叉搜索树。在这里用一个lastVisit去...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)