假设二叉树以二叉链存储,设计一个算法,判断一棵二叉树是否为完全二叉树。
解:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的次序遍历(层次遍历)应该满足:
(1)某结点没有左孩子,则一定无右孩子;
(2)若某结点缺左或右孩子,则其所有后继一定无孩子。
若不满足上述任何一条,均不为完全二叉树。对应的算法如下:
int CompBTNode(BTNode *b)
{ BTNode *Qu[MaxSize],*p; //定义一个队列,用于分层判断
int first=0,rear=0; //顺序队首尾指针
int cm=1; //cm=1表示二叉树为完全二叉树
int bj=1; //bj=1表示到目前为止所有结点均有左右孩子
if (b!=NULL)
{ rear++;
Qu[rear]=b;
while (first!=rear) //队列不空
{ first++; //出队
p=Qu[first];
if (p->lchild==NULL) //*p结点没有左孩子
{ bj=0;
if (p->rchild!=NULL)//没有左孩子但有右孩子, 违反(1),
cm=0;
}
else //*p结点有左孩子
{ if (bj==1) //迄今为止,所有结点均有左右孩子
{ rear++; //左孩子进队
Qu[rear]=p->lchild;
if (p->rchild==NULL)//*p有左孩子但没有右孩子,则 bj=0
bj=0;
else //*p有右孩子,则继续判断
{ rear++; //右孩子进队
Qu[rear]=p->rchild;
}
}
else //bj=0: 迄今为止,已有结点缺左或右孩子
cm=0 //此时*p结点有左孩子,违反(2)
}
} //while
return cm;
}
return 1; //空树当成特殊的完全二叉树