该方法采取层次遍历(回忆层次遍历的实现需要借助一个队列,一边进队一边出队,在出队的同时对结点进行visit())
对于完全二叉树来说,当访问到空结点时说明该树已经完结,之后队列中也将一直为空。
但非完全的二叉树在空结点之后仍有可能出现数据。
根据这个不同,只需正常层次遍历,在出队遇到NULL时,开始检测后边的队伍中是否有非空结点,知道整个队列结束(front==rear),若出现则说明树不完全
bool IsComplete(BiTree T){//完全二叉树返回TRUE,即1
BiTree p;//光标
InitQueue(Q);
if(!T)
return 1;//若树为空,也视作完全
EnQueue(Q,T);//把根结点入队;
while(!IsEmpty(Q)){
DeQueue(Q,p);
if(p){
EnQueue(Q,p->lchild);
EnQueue(Q,p->rchild);
}//层次遍历,上下左右依次入队
else//进到else则队中这一空格空了,可能是树完了,也可能是该空对应的父节点并没有这个孩子。前者是完全,后者不是,开始验证
while(!IsEmpty(Q)){
DeQueue(Q,p);//这次出的已经是刚才的后一个元素了
if(p)//一旦之后还存在结点,则说明不完全
return 0;
}
}//while
}