【LeetCode】之字形顺序打印二叉树(层序遍历 / 双端队列 / 双栈),清晰推演过程

一、题目

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如:
给定二叉树: [3,9,20,null,null,15,7],

  3
 / \
9  20
   /  \
  15   7

返回其层次遍历结果:

[
	[3],
	[20,9],
	[15,7]
]

二、思路分析

这个题目考察的是二叉树的层序遍历的问题。比起普通的层序遍历,它增加了新的要求:按照之子形的顺序来打印。下面我们分别介绍三种实现思路。

1. 层序遍历 + 反转数组

我们在上一篇文章BFS和DFS两种方式实现二叉树的层序遍历中专门介绍了基于广度优先搜索和深度优先搜索来分别实现层序遍历。经过层序遍历得到的结果是这样的:

[
	[3],
	[9,20],
	[15,7]
]

那么我们在此基础上,只需要实现奇数层的数组保持不变,偶数层的数组进行反转。就可以得到我们最终希望得到的结果:

[
	[3],
	[20,9],
	[15,7]
]

那么,只剩下一个问题,如何判断二叉树的一层是奇数层还是偶数层?

最直接的想法是设置一个flag,初始设置为false 表示奇数层;下一层对它取反变为true,表示偶数层;

但还有一个更优雅的方法,不需要设置变量,而是根据最终输出的数组res的元素个数:当元素个数为偶数个数时,当前层是奇数层;当元素个数为奇数个数时,当前层为偶数层。

复杂度分析:

  • 时间复杂度:
    • 每个节点元素进队和出队操作各一次,时间复杂度为 O ( N ) O(N) O(N)
    • 偶数层的元素做反转,即总共有小于N的元素的反转,时间复杂度为 O ( N ) O(N) O(N)
    • 总的时间复杂度为 O ( N ) O(N)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值