步骤分析
先判断根节点是否为空,如果为空,返回[]
再将根节点放在queue数组中。判断是否反转flag初始为false。
当数组长度一直有时,我们便一直循环遍历。在res中存放[]
将根节点定义为cur,将cur的值放在res的第一个(索引为0)的数组中,此时queue长度减一。
于是判断是否有左右子节点,如果有,则存放在queue中。
把存放在res里的值进行反转,即每隔一层翻转一次。因为如果每层都旋转的话务必会打乱顺序。不如我们先将下一层都打印好了之后再反转它的上一层。的
代码如下
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function(root) {
const res = [];
if(!root){
return []
}
// 根节点入队
const queue = [root];
// 是否需要反转的标志位
let flag = false;
// 当队列还有值时,一直执行
while (queue.length) {
let len = queue.length;
res.push([]);
while (len--) {
// 获取根节点,根节点出队
const cur = queue.shift();
//存放值
res[(res.length -1)].push(cur.val);
判断是否有左右子节点
cur.left && queue.push(cur.left);
cur.right && queue.push(cur.right);
}
// 每隔一层,反转一次
flag && res[res.length - 1].reverse();
flag = !flag;
}
return res;
};