首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

如何判断一个二叉树是否是完全二叉树

2012-02-22 
怎么判断一个二叉树是否是完全二叉树?如题假如一个二叉树,用二叉链表方式存储那么如何判断该二叉树是否

怎么判断一个二叉树是否是完全二叉树?
如题;
假如一个二叉树,用二叉链表方式存储;
那么如何判断该二叉树是否是完全二叉树?

[解决办法]
采用层次遍历:
bool IsFullBitree(BinNode * T)//
{
queue<BinNode *> Q;
BinNode *p;
bool flag=false;

if(T!=0)
{
Q.push(T);

while(!Q.empty())
{
p=Q.front();
Q.pop();
if(!p)
flag=true;
else if(flag)
return false;
else
{
Q.push(p->lchild);
Q.push(p->rchild);
}
}
}
return true;
}
[解决办法]
给个思路, 同时满足下面几个条件的:
1. 左、右子树都是完全二叉树
2. 左子树的高度和右子树一样或大1
3. 若左子树比右子树高度大1,则右子树必须是满的(节点数等于2^高度-1)
4. 若左子树和右子树高度一样,左子树必须是满的

满足上面几点的就是完全二叉树,写个递归程序遍历一边,算出层数、节点数以及是否完全二叉树等信息,就可以很容易判断。应该不难
[解决办法]
1.当检查当某个接点只有右儿子时,则退出
2.当检查到某个接点只有左儿子或没有儿子接点,这时要保证接下去遍历的结点都没有儿子,才是完全二叉树,所以设置一个flag标记,一旦发现这种情况,就标记,再取下一个结点的时候因为flag已被标记,所以判断是否没有儿子,如果有,那么就不是完全二叉树,如果队列取空时,都没有出现有儿子的结点,那么就是完全二叉树。

可以画图思考一下。

热点排行