leecode 102.二叉树的层序遍历

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

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

 示例 1:

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

输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]

输出:[[1]]

示例 3:

输入:root = []

输出:[]

思路分析:

二叉树的遍历,我们往往会使用递归的方式来处理,但是这道题需要我们一层一层的返回每一层的所有节点,那我们就不能使用递归的方式来处理整个节点,因为递归是深度优先的遍历方式,而层序遍历则是广度优先的遍历方式,我们需要优先处理完每一个层级之后再处理接下来的一个层级。

那广度优先遍历不使用递归,是使用什么方式实现呢,我们可以通过迭代的方式,通过一个队列,将每一层的节点都加入到队列中,并记录入队的数量,然后再出队之前入队数量个数的元素,这个就是记录每一层的元素从左到右的结果,而出队记录的过程中呢,我们同时会判断是否有左右子节点,如果有的话那就将其左右子节点入队,这样一次循环下来就可以收集到当前层级的所有节点并准备好下一层级的全部节点,将这个过程一直循环,直到队列中不再有新的元素出现时,就说明我们已经将整个二叉树遍历完成。

代码实现:

var levelOrder = function(root) {
    if(!root)return[]
    //最终收集结果的数组
    let res = []
    //循环使用的队列
    let q = []
    q.push(root)
    while(q.length!=0){
        //获取当前层级元素个数
        let sz = q.length
        let qe = []
        for(let i = 0;i<sz;i++){
            let root = q.shift()
            qe.push(root.val)
            root.left&&q.push(root.left)
            root.right&&q.push(root.right)
        }
        res.push(qe)
    }
    return res
};