算法挑战18: 二叉树层序遍历优化

4 阅读1分钟

先看下面我用队列进行二叉树层序遍历的代码

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;
};