具体思路:
将二叉树层序遍历(节点)插进队列中,遇到空时就break(退出循环),再重新遍历一遍,若空的后面又再次出现数据,则返回false(不是完全二叉树),否则(即前面条件不满足)返回true(是完全二叉树)。
(提前所创树结构):
判断函数:
// 判断二叉树是否是完全二叉树
bool TreeComplete(TreeNode* root)
{
Queue q;
QueueInit(&q);
if (root)
QueuePush(&q, root);
int levelSize = 1;
while (!QueueEmpty(&q))
{
TreeNode* front = QueueFront(&q);
QueuePop(&q);
if (front == NULL)
break;
QueuePush(&q, front->left);
QueuePush(&q, front->right);
}
// 前面遇到空以后,后面还有非空就不是完全二叉树
while (!QueueEmpty(&q))
{
TreeNode* front = QueueFront(&q);
QueuePop(&q);
if (front)
{
QueueDestroy(&q);
return false;
}
}
QueueDestroy(&q);
return true;
}
输出结果:
队列的源码位于上篇文章中,可自行参考。