先看下面我用队列进行二叉树层序遍历的代码
var levelOrder = function (root) {
if (!root) return [];
let q = [root];
let answer = [];
while (q.length !== 0) {
let vals = [];
for(const c of q){
q.shift(c);//遍历到这层的这个节点就出栈
vals.push(c.val);
if(c.left){
q.push(c.left);
}
if(c.right){
q.push(c.right);
}
}
answer.push(vals)
}
return answer;
};
你能发现几处错误?
我写好之和反正没通过, 看半天也没找出个问题
索性直接交给ai了
它直接给我指出了错误
第一: Array.prototype.shift() 方法不接受参数 ,我在shift()里面写了个c。
第二: 在 for...of 循环中直接修改正在遍历的数组(尤其是从头部删除元素,我使用的shift)会导致遍历错乱或跳过元素。
第二个似乎更严重, 第一个直接删除参数就可以, 而第二个导致遍历结果直接混乱
正确写法如下:
var levelOrder = function (root) {
if (!root) return [];
let q = [root];
let answer = [];
while (q.length !== 0) {
let vals = [];
let levelSize = q.length;//先储存好栈的长度,防止在元素出栈导致栈的长度改变
for(let i = 0; i < levelSize;i++){
let node = q.shift(); //先储存起来,方便后续使用
//后续操作都用node
vals.push(node.val);
if(node.left){
q.push(node.left);
}
if(node.right){
q.push(node.right);
}
}
answer.push(vals)
}
return answer;
};