数据结构——二叉树的层序遍历

层序遍历

二叉树的遍历的核心问题就是:二维结构的线性化。
简单来说就是以下两个操作:

  • 从结点访问其左、右儿子结点
  • 访问左儿子后,右儿子结点怎么办?

因为树是二维结构,即一个结点是连接了两个结点。当我访问了某个结点的其中一个子结点后,另外一个要怎么办?肯定要把它保存起来,或者把自己保存起来,因为我自己在,我就可以找到另外一个子结点。因此我们需要考虑如何解决上述的问题。方法如下:

  • 需要一个存储结构保存暂时不访问的结点

  • 存储结构:堆栈、队列

什么是层序遍历

层序遍历是比较接近人的思维方式的一种遍历方法,将二叉树的每一层分别遍历,直到最后的叶子节点被全部遍历完,这里要用到的辅助数据结构是队列,队列具有先进先出的性质。

为什么用队列?
从二叉树的第一层(根节点)开始,从上至下逐层遍历,在每一层中又按照从左到右的顺序对结点逐个遍历。我们可以看出如果某个结点比同一层的先遍历,其孩子也将比其同层的孩子结点先遍历,这种先进先出的方式,是队列的性质。

层序遍历的实现过程:
层序基本过程:先根结点入队,然后:
①从队列中取出一个元素;
②访问该元素所指结点;
③若该元素所指结点的左、右孩子结点非空,
则将其左、右孩子的指针顺序入队。在这里插入图片描述

代码如下:

void LevelOrderTraversal ( BinTree BT )
{ 
	Queue Q; BinTree T;
	if ( !BT ) return; /* 若是空树则直接返回 */
	Q = CreatQueue( MaxSize ); /*否则创建并初始化队列Q*/
	AddQ( Q, BT );
	while ( !IsEmptyQ( Q ) ) 
	{
		T = DeleteQ( Q );
		printf(%d\n”, T->Data); /*访问取出队列的结点*/
		if ( T->Left ) AddQ( Q, T->Left );/*左孩子存在就将左孩子压入队列*/
		if ( T->Right ) AddQ( Q, T->Right );/*右孩子存在就将右孩子压入队列*/
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值