所以我正在研究这个leet代码问题。
这是解决方案
var levelOrder = function(root) {
let q = [root], ans = []
while (q[0]) {
let qlen = q.length;
let row = [];
for (let i = 0; i < qlen; i++) {
let curr = q.shift()
row.push(curr.val)
if (curr.left) q.push(curr.left)
if (curr.right) q.push(curr.right)
}
ans.push(row)
}
return ans
};
然而,我对while循环感到困惑。为什么当它是while (q[0]) {
时它会起作用而当我使用while (q.length) {
时则不是这几乎是一样的,不是吗?有人能帮我理解吗?由于
while(q[0])
检查发生的情况是,作者通过调用q.shift()
确保数组不是空的,因为在每次迭代中都删除了一个项目。array .prototype.shift()从数组中移除最左边的元素,是一个可变方法。
知道每个元素不是空的更实用,因为输入可以是数组的数组,否则,您将不得不遍历每个元素并计算其长度。
有人在leet上回答了这个问题,我把它转发给其他人,这样其他人就可以受益了
因为根可能为空,在这种情况下,我们应该跳过while循环,继续返回ans,即使q.length = 1。
或者,我们可以在while循环之前插入if (!root) return[]行(类似于c++或Java解决方案),或者将q定义更改为q = root ?[root]:[](类似于Python的解决方案)。
感谢gallivan