二叉树层序遍历、判断是否是完全二叉树

二叉树的层序遍历

二叉树的层序遍历我们需要用到队列,先把根节点放进队列,当队首不为空时,取队首元素,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);
}

猜你喜欢

转载自blog.csdn.net/qq_40550018/article/details/83590812