BM27 按之字形顺序打印二叉树

题目描述

image

思路分析

这题在上一道 层序遍历的基础上会更加方便。我们之前就可以得到每一层的数据,此时只是对每一层的遍历顺序做相应的处理即可
注意:
1. 我们在向tempQueue中添加元素时使用的是push ,比如我们一棵树的某一层从左到右的结果依次是
2 4 6 8,那么我们依次添加到tempQueue中的数据顺序也是 2 4 6 8 因为我们是对左子树和右子树分别判断,如果有结果 就将其push进去
2. 之后再处理结果时,是对数组中的每一项元素 shift处理,也就是 会依次得到 2 4 6 8 这是当我们遍历偶数层时想要得到的结果
3. 之后再遍历奇数层时,我们想要存进curLevel中的顺序为 8 6 4 2 ,此时从tempQueue中的数据仍然是shift出的,也就是我们依次得到的数据为 2 4 6 8,如何得到8 6 4 2?对于奇数深度,我们就要使用unshift,也就是从头部插入,就会得到我们想要的预期结果。
4. 其它部分的代码与之前的层序遍历类似,只是我们在每一层上加了一层判断,其余的不变。

代码参考

/*
  给定一个二叉树,返回该二叉树的之字形层序遍历,
  (第一层从左向右,下一层从右向左,一直这样交替)
*/

const Print = function (root) {
  // 初始化result以及临时数组用于存储
  const result = [],
    tempQueue = []
  // 表示当前深度
  let depth = 0
  if (!root) return result
  tempQueue.push(root)
  while (tempQueue.length) {
    const len = tempQueue.length
    const curLevel = []
    const flag = depth % 2 === 0
    for (let i = 0; i < len; i++) {
      // 存数据时都是push进数组的,是有顺序的,先left再right,比如 2 4 6 8
      // 我们对数组是shift,也就是会先弹出2 之后在 4 6 8
      const node = tempQueue.shift()
      // 如果是偶数层,那么需要得到的结果为 2 4  6 8
      // 如果是偶数层,则需要得到的结果顺序为 8 6 4 2, 
      flag ? curLevel.push(node.val) : curLevel.unshift(node.val)
      node.left && tempQueue.push(node.left)
      node.right && tempQueue.push(node.right)
    }
    // 深度++
    depth++
    result.push(curLevel)
  }
  return result
}
posted @ 2023-01-01 23:05  含若飞  阅读(11)  评论(0编辑  收藏  举报