1. 题目描述

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

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

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

返回锯齿形层次遍历如下:

  1. [
  2. [3],
  3. [20,9],
  4. [15,7]
  5. ]

2. 解题思路

可以采用递归的方式来解答,每一层都创建一个数组,奇数层从左往右依次插入数组,偶数层从右往左依次插入数组

思路不是很难,这里我们使用i & 1来判断层数的奇偶:

  1. i & 1 == 1 // 奇数
  2. i & 1 == 0 // 偶数

该方法的时间复杂度为O(n)空间复杂度为O(n)

3. 代码实现

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {number[][]}
  11. */
  12. var zigzagLevelOrder = function(root) {
  13. const res = []
  14. function dfs(i, current){
  15. if(!current) return
  16. if(!Array.isArray(res[i])){
  17. res[i] = []
  18. }
  19. if(i & 1){
  20. res[i].unshift(current.val)
  21. }else{
  22. res[i].push(current.val)
  23. }
  24. dfs(i + 1, current.left)
  25. dfs(i + 1, current.right)
  26. }
  27. dfs(0, root)
  28. return res
  29. };

4. 提交结果

103. 二叉树的锯齿形层次遍历 - 图1