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
};