数据结构初阶——二叉树(Part3)

今天我们来到了二叉树的最后一部分(当然只是对于初阶来说)~~~

目录

一、层序遍历(LevelOrder)

1、什么是层序遍历?

2、实现思路 

3、代码实现

4、变式:判断一棵二叉树是否为完全二叉树

(1)实现思路

(2)代码实现


一、层序遍历(LevelOrder)

1、什么是层序遍历?

层序遍历其实就是 bfs ,也就是宽度优先搜索。意思就是一层一层横向地访问节点,而不是纵向访问。

2、实现思路 

假设有这样一棵二叉树:

 如果层序遍历它的话,那么结果应该是这样的:

 而你看这个数组就不难发现:1 是第一层的数据;2  4  是第二层的数据;3  5  null  6 是第三层的数据;null  7 是第四层的数据...

 而且,我们还发现,2,4  是 1 的孩子节点;3,52 的孩子节点;null,6  是 4 的孩子节点;null,7是 的孩子节点。

所以,为了达到这个效果,我们要借助队列。每次当根节点出队时让它的左右孩子节点入队,如此循环往复,直到队列再次为空。

3、代码实现

void BinaryTreeLevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);

	QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		root = QueueFront(&q); /* 为了把 root 指针指向孩子节点 */
		QueuePop(&q);
		printf("%d ", root->_data);

		if (root->_left != NULL)
			QueuePush(&q, root->_left);

		if (root->_right != NULL)
			QueuePush(&q, root->_right);

	}

	QueueDestroy(&q);
}

4、变式:判断一棵二叉树是否为完全二叉树

(1)实现思路

众所周知,完全二叉树有个特点:最后一层的节点是连续的,一旦遇到第一个空节点,那么后面的节点都应该为空。因此,我们可以通过层序遍历最后一层,在遇到空节点之后如果还有不为空的节点,那么就不是完全二叉树。

但要注意:这里的层序遍历是就算遇到空节点也要让它进队列。

(2)代码实现

bool BinaryTreeComplete(BTNode* root)
{
	Queue q;
	QueueInit(&q);

	QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		root = QueueFront(&q); /* 为了把 root 指针指向孩子节点 */

		if (root == NULL)
		{
			break;
		}
		else
		{
			QueuePop(&q);
			QueuePush(&q, root->_left);
			QueuePush(&q, root->_right);
		}
	}

	/* 遍历队列 */
	while (q.front != NULL)
	{
		if (q.front->data != NULL)
		{
			QueueDestroy(&q);
			return false;
		}

		q.front = q.front->next;
	}

	QueueDestroy(&q);
	return true;
}

好啦,二叉树初阶环节到这里就结束了~~~

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胎粉仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值