题目描述
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
广度优先
广度优先比较直观,就是按层次遍历
我们将每层遍历到的结果保存到一个数组中:
- 第一层 对应 第一个数组
- 第二层 对应 第二个数组
- 第三层 对应 第三个数组
- 以此类推。。。
这题要求的是锯齿形层序遍历,所以上图遍历的结果就是:
[[1]
[3,2]
[4,5,6,7]]
这也好办,我们发现奇数层的是从左往右添加到数组中的,偶数层的是从右往左添加到数组中的
这里我们可以直接借用二叉树的层次遍历代码,在判断奇偶层的时候做一些改动:
- 如果是奇数层,还是保持原样,正常添加到数组中,每次插入到末尾
- 如果是偶数层,还是正常添加,每次插入到末尾,等这层遍历完之后,翻转一下这个数组即可
时间复杂度:O(N)
空间复杂度:O(N)
java代码:
class Solution {
public List> zigzagLevelOrder(TreeNode root) {
if(root == null) {
return n