二叉树的层序遍历
二叉树的层序遍历我们需要用到队列,先把根节点放进队列,当队首不为空时,取队首元素,Pop队列,打印队首元素,如果队首结点的左子树不为空,就把队首结点的左子树放到队列中,如果队首结点的右子树不为空,就把队首节点的右子树放到队列中。
void LevelOrder(BNode *root)
{
Queue queue;
QueueInit(&queue);
if (root == NULL)
{
return;
}
QueuePush(root,root->data);
while (!(QueueEmpty(&queue)))
{
BNode *front = QueueFront(&queue);
QueuePop(&queue);
printf("%d ", front->data);
if (front->left != NULL) {
QueuePush(&queue,front->left);
}
if (front->right != NULL)
{
QueuePush(&queue, front->right);
}
}
QueueDestory(&queue);
}
判断一颗二叉树是不是完全二叉树
判断一颗二叉树是否是完全二叉树,其实和上面的层序遍历有点联系,仔细把过程写一遍就会发现,如果一棵树是完全二叉树,那么它的层序遍历的空节点一定在后面,中间不会有空节点,如果中间有空间点的话,这棵树就不是完全二叉树。
int IsComplete(BNode *root)
{
Queue queue;
QueueInit(&queue);
if (root == NULL)
{
return 1;
}
QueuePush(root, root->data);
while (!(QueueEmpty(&queue)))
{
BNode *front = QueueFront(&queue);
QueuePop(&queue);
if (front == NULL) {
break;
}
QueuePush(&queue, front->left);
QueuePush(&queue, front->right);
}
while (!(QueueEmpty(&queue)))
{
BNode *node = QueueFront(&queue);
QueuePop(&queue);
if (node != NULL)
{
return 0;
}
}
return 1;
QueueDestory(&queue);
}