二叉树遍历之层序遍历

不同于 二叉树遍历之递归遍历 和 二叉树遍历之迭代遍历

我们还可以采用每一层的遍历顺序来访问树的节点

考虑一个问题:

访问完左子节点如何能够访问右子节点呢,他们是平级关系,兄弟节点

如若要访问,势必要再次利用父节点作为过渡,那么

当这个树特别大时,还要来回的从 最左子节点<>根节点 <> 最右子节点,这是不现实的

如何解决:

方法一、队列方式

        111. 二叉树的最小深度 文章的广度优先算法内容

        另外一种用方式更加友好,动态分配队列,参考

        剑指 Offer II 045. 二叉树最底层最左边的值

方法二、数组方式

        如果我们对每一个树节点给点一个序号,那么再用计数数组的思想将序号对应到一维数组坐标,无论采用哪种遍历方式,最终生成的一维数组存储的就是整棵树以层序得来的结果

        如果根节点序号=1,那么其左子节点=2,右子节点=3,依次排序,我们会发现

        如果父节点序号=i,那么其左子节点序号=2*i,其右子节点序号=2*i+1,空节点依旧要标号

实现代码:

void levelorder(struct TreeNode* root, int idx, int *array)
{
	if(root == NULL)
		return;
	
	array[idx] = root->val;
	
	levelorder(root->left, 2*idx, array);
	levelorder(root->right, 2*idx+1, array);
}


levelorder(node1, 1, array);

 要特别注意,因为倍数关系,序号的增长是非常快的,数组的空间要预留很大

-------levelorder------
array[1]=1
array[2]=2
array[3]=3
array[4]=4
array[6]=5
array[7]=6
array[15]=7

更多数据结构详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值