文章目录
1.二叉树层序遍历
2.完全二叉树的判断
文章内容
1.二叉树层序遍历
二叉树的层序遍历需要一个队列来帮助实现。
我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义,
以上代码 从逻辑上来讲就是1入队,1出队,2(1的左孩子)入队,4(1的右孩子)入队,2出队......
//层序遍历
void LevelOrder(BTNode* root)
{
Que q;
QueueInit(&q);
if (root)
{
QueuePush(&q,root);
}
while (!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
printf("%d ",front->data);
QueuePop(&q);
if (front->left)
{
QueuePush(&q, front->left);
}
if (front->right)
{
QueuePush(&q, front->right);
}
}
printf("\n");
QueueDestroy(&q);
}
2.完全二叉树的判断
完全二叉树的判断和二叉树的层序的思想差不多,都需要借助队列来实现。
bool TreeComplete(BTNode* root)
{
Que q;
QueueInit(&q);
if (root)
{
QueuePush(&q, root);
}
while (!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
// printf("%d ", front->data);
QueuePop(&q);
if (front) //front的左子树 右子树 不管为不为空都入队
{
QueuePush(&q, front->left);
QueuePush(&q, front->right);
}
else
{
break;//当front 为空的时候,跳出循环开始判断是否为完全二叉树
}
}
while (!QueueEmpty(root))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
if (front)
{
QueueDestroy(root);
return false;
}
}
// printf("\n");
return true;
}