LeetCode: 102.二叉树的层序遍历|刷题打卡

207 阅读2分钟

一、题目描述

给定一个二叉树,请你返回按照其 层序遍历 的到的节点值。

注: 即逐层的,从左到右访问所有节点。

示例:
给定二叉树 [3, 9, 20, null, null, 15, 7]

   3
  / \
 9  20
   /  \
  15   7

返回其层次遍历的结果:

[
	[3],
    [9, 20],
    [15, 7]
]

二、思路分析

层序遍历实际上就是广度优先遍历。
需要注意的在遍历的时候需要记录当前节点所处的层级,方便将其添加到不同的数组当中。

三、AC 代码

方法 1: 在迭代的队列中添加表示层的标识,然后通过标识来生成数组。

var levelOrder = function(root) {
    if(!root) return [] // 边界判断

    const q = [[root, 0]] // 队列
    const res = [] // 返回的数组
	
    // 当栈里还有内容的时候就执行代码块里的内容
    while(q.length) {
        const [n, l] = q.shift() // 取出队头的数据
		
        // 根据层级添加数据
        res[l] 
            ? res[l].push(n.val)
            : res[l] = [n.val]
        
        // 判断是否有子节点,如果有则添加到队列当中
        if(n.left) q.push([n.left, l + 1])
        if(n.right) q.push([n.right, l + 1])
    }

    return res
}

方法 2: 该方法无需去记录和判断每层的层级标识。相对于上述方法运算速度更快,内存消耗更少。

var levelOrder = function(root) {
    if(!root) return []

    const q = [root]
    const res = []

    while(q.length) {
        let length = q.length // 获取当前层所有数据的长度
        const arr = [] // 初始化用来存储当前层的数组
        res.push(arr) // 添加到 res 里面
        
        // 当前层的数据还没有全部出队就执行代码块的内容
        while(length--) {
            const n = q.shift() // 取出队头的数据
            arr.push(n.val) // 添加到当前层的数组中
            
            // 判断是否有子节点,如果有则添加到队列当中
            if(n.left) q.push(n.left) 
            if(n.right) q.push(n.right)
        }
    }

    return res
}

四、总结

该问题主要的是如何去记录每个数据的层级的标识,只要你了解广度优先遍历以及队列该题就很容易了。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情