[路飞]_程序员必刷力扣题: 103. 二叉树的锯齿形层序遍历

639 阅读2分钟

103. 二叉树的锯齿形层序遍历

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

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

提示:

节点总数 <= 1000

层序遍历

思路

题目要求我们将:每一层打印到同一行,并且是锯齿形,我们需要一个变量来判断行的切换

首先处理边界条件:root无效直接返回[]

遍历方式:层序遍历

实现方式

因为要将每一行的结果打印在一起,所以我们需要记录每一行的一个状态,保证当前的所有元素在同一行

修改层序遍历方式:

这里我们通过格外的数组curr来表示当前行的信息,将每一行的子元素push到curr中,这样当stack遍历结束时,curr就保存的是下一行的所有节点,stack保存的是当前行的所有节点。(不能直接push到stack中,否则无法区分行的信息)

还需要一个变量line来存储切换行的信息,一个数组currRes来保存当前行的所有结果,

当line为true直接push 的方式存入结果,如果line为false直接用unshift方法将结果倒序存入

当stack为空时,代表当前行遍历结束。

  • line 为true。push方法正序,为false,unshift方法倒序将结果存入currRes
  • 将currRes的结果push到结果集合res中,然后清空currRes
  • 将curr赋值给stack,并清空curr

遍历结果拿到结果集合res,返回res

var zigzagLevelOrder = function (root) {
    var res = []
    var line = true
    if (!root) return res
    var stack = [root]
    var curr = []
    var currRes = []
    while (stack.length) {
        var item = stack.shift();
        if (line) {
            currRes.push(item.val)
        } else {
            currRes.unshift(item.val)
        }
        if (item.left) curr.push(item.left)
        if (item.right) curr.push(item.right)
        if (!stack.length) {
            line = !line
            res.push(currRes)
            stack = curr
            curr = []
            currRes = []
        }
    }
    return res
};