二叉树按二叉链表形式存储,设计算法判断给定二叉树是否是完全二叉树
根据完全二叉树的定义,具有n个结点的完全二叉树与满二叉树中编号从1~n的结点一一对应。算法思想:采用层次遍历算法,将所有结点加入队列(包括空结点)。遇到空结点时,查看其后是否有非空结点。若有,则二叉树不是完全二叉树。
队列的基本操作以严蔚敏编写的教材为准。
算法实现来自王道的数据结构5.3.3节综合应用题的第7题:
bool IsComplete(BiTree T)
{
InitQueue(Q); //初始化队列
if(!T) //空的二叉树也是满二叉树
return 1;
EnQueue(Q, T); //根结点入队
while(!QueueEmpty(Q)) //队不空,则循环
{
DeQueue(Q, p); //队头结点出队
if(p) //结点非空
{
//一般二叉树的层次遍历在这步需要判断左右子树是否为空,不空才入队
//但是我们这里要判断的是给定的二叉树是否为完全二叉树,所以不管是否为空,直接入队
EnQueue(Q, p->lchild);
EnQueue(Q, p->rchild);
}
else //结点为空,即遇到了空结点
{
while(!QueueEmpty(Q)) //队不空,则循环查看其后是否有非空结点
{
DeQueue(Q, p); //队头结点出队
if(p) //结点非空,则二叉树不是完全二叉树,返回0
return 0;
}
}
}
return 1; //二叉树是完全二叉树,返回1
}