剑指 Offer 32 - II. 从上到下打印二叉树 II
第一层while循环 while(q.length),在循环体内,如果在一次循环内,导致q.length为0,则结束循环,否则一直循环。
第二层while循环 while(len--) 因为len是在此循环体外声明的,所以在第一层while的任何一次循环内,len是初始值敲定了的,一旦声明len = q.length,则不会收到q的长度变化了
const levelOrder = root => {
if (!root) return [];
const res = [];
// 根节点入队
const q = [root];
// 当队列还有值时,一直执行
// 第一次为1 但是在循环体内 改变了q的长度,所以会一直执行,直到q为空数组了结束循环
while (q.length) {
let len = q.length;
res.push([]);// 每次循环都会声明一个新数组 放入res后面
while (len--) {// 首次len为1 减了一次后,下一次直接结束循环,进入外层循环
const n = q.shift();// 这里删除q中一个元素了
res[res.length - 1].push(n.val);//res最后一个数组放入值
// 队头左右节点入队
n.left && q.push(n.left);
n.right && q.push(n.right);
}
}
return res;
};
剑指 Offer 32 - III. 从上到下打印二叉树 III
const levelOrder = root => {
if (!root) return [];
const res = [];
// 根节点入队
const q = [root];
// 当队列还有值时,一直执行
var n = 2
while (q.length) { // 第一次为1 但是在循环体内 改变了q的长度,所以
let len = q.length;
res.push([]);
while (len--) {// 首次len为1 减了一次后,下一次直接结束循环
// 获取根节点,根节点出队
const n = q.shift();
// 根节点加入res栈顶元素
res[res.length - 1].push(n.val);
// 队头左右节点入队
n.left && q.push(n.left);
n.right && q.push(n.right);
}
if(n%2){
res[res.length - 1].reverse()
}
n++
}
return res;
};