前端算法(59)

66 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]

题目解析

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前的都不太一样,我们需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是广度优先遍历也叫作BFS,只不过我们应用在二叉树上

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    //依次处理当前层,访问下一层
    let que = [];
    let res = [];
    if (root === null) {
        return res;
    }
    que.push(root);
    while (que.length !== 0) {
        // 获取本层需要处理的队列长度
        let length = que.length;
        // 创建本层结果集
        let curLevel = [];
        // 处理本层队列中的节点
        for (let i = 0; i < length; i++) {
            let node = que.shift();
            curLevel.push(node.val);

            // 访问下层节点
            if (node.left !== null) {
                que.push(node.left);
            }
            if (node.right !== null) {
                que.push(node.right);
            }            
        }
        // 将本层结果加入结果集
        res.push(curLevel)
    }
    //返回结果
    return res;
};

思路二

我们进行一层一层遍历,遍历中我们需要记录本层级结果列表和取出所有下层级节点且进行判断是否继续下层循环

var levelOrder = function (root, list = []) {
//如果当前数据为false则直接返回空数组
    if(!root) return [];
    let q = [root];
    const ans = [];
    //进行循环
    while (q.length > 0) {
        // 先把下一层节点保存好
        const nextLevelNodeList = [];
        // 存放本层级结果
        const levelAns = [];
        // 遍历队列中现有的元素,将所有下层级元素都存起来
        for (n of q) {
            n.left && nextLevelNodeList.push(n.left);
            n.right && nextLevelNodeList.push(n.right);
            // 记录本层级结果项
            levelAns.push(n.val);
        }
        // 将本层级结果保存
        ans.push(levelAns);
        // 替换下层级节点列表,继续循环
        q = nextLevelNodeList;
    }
    return ans;
};