一、题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [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)