从上到下打印二叉树 II 和 III

109 阅读1分钟

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


image.png 剑指 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;
};

image.png