判断一棵树是否为完全二叉树
1)用递归算法写,左子树的层数永远和右子树的层数永远相同或者左子树层数比右子树层数一为完全二叉树,后经检验发现,某些二叉树满足要求但却不满足完全二叉树的要求,还需要考虑倒数第二层几个结点均只有左孩子的情况,这样一来,需要讨论的情况较多,考虑采用其他算法
2)参考层序遍历的算法,利用队列作为储存结构,将二叉树从上到下,从左到右遍历,对于完全二叉树来说,一旦队列中读到空指针,则必定已将二叉树遍历完全了,否则若空指针后还有为访问的元素,则不是完全二叉树,代码如下
//判断是否为完全二叉树
Status judge_completeBiTree(BiTree T){
if(!T) return OK;
SqQueue Q;
BiTree p;
p=T;
InitQueue(&Q);//初始化队列
EnQueue(&Q,p);//根结点入队
while(!QueueEmpty(Q)){
DeQueue(&Q,&p);
if(!p) break;//读到空指针则停止循环
EnQueue(&Q,p->lchild);//左孩子入队
EnQueue(&Q,p->rchild);//右孩子入队
}
while(!QueueEmpty(Q)){//检查此时队列中是否还有未访问到的结点
DeQueue(&Q,&p);
if(p) return FALSE;
}
return TRUE;
}