注意要设置结点层级,所以推入队列和从队列拿出的都是包含结点和层级的数组。
// 层次遍历:
// 初始化一个队列
// 将根结点推入队列,遍历队列,遍历条件为队列不为空
// 出列队列队首元素
// 访问该元素的左右孩子,有左右孩子则推入队列中
// 递归以上
var levelOrder = function (root) {
if (!root) return [];
let queue = [];
let res = [];
// 推入数组内容为根结点和层级的数组
// 因为题目输出是 数组嵌套数组,且每一层的值在一个数组中
// 所以要记录二叉树的层级,把对应层级的结点值存入一个数组中
// 再把这个层级数组推入到最终的数组中
queue.push([root, 0]);
// 队列不为空
while (queue.length) {
// 出队,取出对应的结点和该结点的层级
let [node, level] = queue.shift();
// 如果res数组中没有下标为该层级的数组元素,推入结点值数组
if (!res[level]) {
res.push([node.val]);
}
// 存在下标为层级的数组元素,就向该数组中推入结点值
else {
res[level].push(node.val);
}
// 入队,入队的是数组结构的结点和层级
// 每次新入队都是下一个层级了,所以level+1
if (node.left) queue.push([node.left, level + 1]);
if (node.right) queue.push([node.right, level + 1]);
}
return res;
};