判断一个树是不是完全二叉树,要用到队列的知识。
就是在一个二叉树中找到最后一个非叶子节点,当这个结点左孩子存在、右孩子不存在或者左右孩子都不存在的时候,这个二叉树就是一个完全二叉树,否则就不是一个完全二叉树。
判断的过程:
1.树空,不是完全二叉树。
2.树只有根节点,就是一个完全二叉树。
3.先将根节点入队列
当一个节点的左右孩子都存在的时候,就让这个节点的左右孩子入队列,并且让这个节点出队列,
左孩子不存在、右孩子存在直接返回,
左孩子存在、右孩子不存在或者左右孩子都不存在,就让这个节点出队列,这时,如果队列中的所有节点都没有左右孩子,那么这就是一个完全二叉树。
int IsCompleteBinTree(BTNode* pRoot)//是不是完全二叉树
{
Queue queue;
initqueue(&queue);
BTNode* ret = NULL;
if (pRoot == NULL)//树空
return 0;
if (pRoot->left == NULL&&pRoot->right == NULL)//根节点没有左右孩子
return 1;
if (pRoot != NULL)//让根节点进入队列
{
pushqueue(&queue, pRoot);
}
while (queue.head->next!=NULL)//队列不为空
{
ret = headqueue(&queue);
if (ret->left != NULL&&ret->right != NULL)//左右孩子不为空
{
pushqueue(&queue, ret->left);
pushqueue(&queue, ret->right);//左右孩子进入队列
popqueue(&queue);//当前节点出队列
}
else if (ret->left == NULL&&ret->right != NULL)//左孩子没有,右孩子有一定是不是完全二叉树
return 0;
else if ((ret->left != NULL&&ret->right == NULL) || (ret->left == NULL&&ret->right == NULL))
{
popqueue(&queue);
while (queue.head->next!=NULL)
{
ret = headqueue(&queue);
if (ret->left == NULL&&ret->right == NULL)//判断当前节点后的所有节点是不是叶子节点
{
popqueue(&queue);
}
else
{
return 0;
}
}
return 1;
}
}
return 1;
}