前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 102. 二叉树的层序遍历 Binary Tree Level Order Traversal (广度优先搜索(BFS))

LeetCode 102. 二叉树的层序遍历 Binary Tree Level Order Traversal (广度优先搜索(BFS))

作者头像
一个会写诗的程序员
修改于 2023-09-21 10:19:52
修改于 2023-09-21 10:19:52
56500
代码可运行
举报
运行总次数:0
代码可运行

102. 二叉树的层序遍历

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

示例:

二叉树:[3,9,20,null,null,15,7],

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 3
/ \
9  20
  /  \
 15   7

返回其层次遍历结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
[3],
[9,20],
[15,7]
]
  1. Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example: Given binary tree [3,9,20,null,null,15,7],

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 3
/ \
9  20
  /  \
 15   7

return its level order traversal as:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
[3],
[9,20],
[15,7]
]

解法

这道题适合用广度优先搜索(BFS),以及 BFS 适用于什么样的场景。

DFS(深度优先搜索)和 BFS(广度优先搜索)就像孪生兄弟,提到一个总是想起另一个。然而在实际使用中,我们用 DFS 的时候远远多于 BFS。那么,是不是 BFS 就没有什么用呢?

如果我们使用 DFS/BFS 只是为了遍历一棵树、一张图上的所有结点的话,那么 DFS 和 BFS 的能力没什么差别,我们当然更倾向于更方便写、空间复杂度更低的 DFS 遍历。不过,某些使用场景是 DFS 做不到的,只能使用 BFS 遍历。这就是我们要介绍的两个场景:「层序遍历」、「最短路径」。

给定一个二叉树,返回其按层序遍历得到的节点值。 层序遍历即逐层地、从左到右访问所有结点。

什么是层序遍历呢?简单来说,层序遍历就是把二叉树分层,然后每一层从左到右遍历:

乍一看来,这个遍历顺序和 BFS 是一样的,我们可以直接用 BFS 得出层序遍历结果。然而,层序遍历要求的输入结果和 BFS 是不同的。层序遍历要求我们区分每一层,也就是返回一个二维数组。而 BFS 的遍历结果是一个一维数组,无法区分每一层。

那么,怎么给 BFS 遍历的结果分层呢?我们首先来观察一下 BFS 遍历的过程中,结点进队列和出队列的过程:

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package i.levelOrder

import java.util.*

/**
 * @author: Jack
 * 2020-05-13 22:04
 *

 */

fun main() {
    val root = TreeNode(3)
    root.left = TreeNode(9)

    val right = TreeNode(20)
    right.left = TreeNode(15)
    right.right = TreeNode(7)

    root.right = right

    val ans = levelOrder(root)
    println(ans)

    val ans2 = levelOrderRecursive(root)
    println(ans2)

}


/**
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */


/**
 * Queue Solution
 */
fun levelOrder(root: TreeNode?): List<List<Int>> {
    val ans = mutableListOf<List<Int>>()

    if (null != root) {
        val queue = LinkedList<TreeNode>()
        queue.offer(root)

        while (queue.isNotEmpty()) {
            
            val levelList = mutableListOf<Int>()
            val size = queue.size

            // 此处的for循环会把当前 level 层的所有元素poll出来,同时把下一层待遍历的节点放入队列
            for (i in 0..size - 1) {
                // removes the head (first element) of this list
                val node = queue.poll()
                levelList.add(node.`val`)

                // 把下一层待遍历的节点放入队列尾部 tail (last element) of this list.
                node.left?.let { left -> queue.offer(left) }
                node.right?.let { right -> queue.offer(right) }
            }

            // 每层的List值,存放到ans中
            ans.add(levelList)

        }

    }

    return ans

}


fun levelOrderRecursive(root: TreeNode?): List<List<Int>> {
    val ans = mutableListOf<MutableList<Int>>()
    visitLevel(ans, 0, root)
    return ans
}

fun visitLevel(ans: MutableList<MutableList<Int>>, level: Int, node: TreeNode?) {
    if (null == node) return
    // level 从0 (root) 开始,此时 ans.size = 0; 每层的值存在 levelList 中. 这地方的代码非常巧妙.
    if (ans.size == level) {
        val levelList = mutableListOf<Int>()
        ans.add(levelList)
    }

    // 当前节点值存到 levelList 中
    ans[level].add(node.`val`)

    val left = node.left
    val right = node.right

    if (null != left)
        visitLevel(ans, level + 1, left)

    if (null != right)
        visitLevel(ans, level + 1, right)

}


class TreeNode(var `val`: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null
}

参考资料

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode笔记:102. Binary Tree Level Order Traversal
image.png return its level order traversal as: [   [3],   [9,20],   [15,7] ]
Cloudox
2021/11/23
2200
LeetCode笔记:102. Binary Tree Level Order Traversal
Tree - 102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
ppxai
2020/09/23
3300
[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)
https://github.com/cwiki-us/java-tutorial/blob/master/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0069LevelOrderTest.java
HoneyMoose
2019/01/30
3460
102 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。
木瓜煲鸡脚
2021/01/18
3770
102 二叉树的层序遍历
【LeetCode每日打卡】102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
韩旭051
2020/06/23
2780
102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 「层序遍历」 。(即逐层地,从左到右访问所有节点)。
chuckQu
2022/08/19
3790
LeetCode 102 & 103 &107 & 637. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
大学里的混子
2018/10/31
3090
​LeetCode刷题实战102:二叉树的层序遍历
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
2960
​LeetCode刷题实战102:二叉树的层序遍历
LeetCode 102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 return its level order traversal as: [ [
ShenduCC
2018/06/21
2930
Leetcode No.102 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
week
2021/11/29
3580
Leetcode No.102 二叉树的层序遍历
LeetCode笔记:107. Binary Tree Level Order Traversal II
image.png return its bottom-up level order traversal as: [   [15,7],   [9,20],   [3] ]
Cloudox
2021/11/23
1840
LeetCode笔记:107. Binary Tree Level Order Traversal II
二叉树的层序遍历(二叉树)(BFS)
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
SakuraTears
2022/01/13
2270
Leetcode 102 Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 return its level order traversal as:
triplebee
2018/01/12
5030
leetcode刷题(49)——102. 二叉树的层次遍历
这里巧妙一处在于,for循环的范围是level_length,这样即使当在for循环中queue添加了节点,也是会到下一层了,如果是直接用queue.size();会一直都在一层
老马的编程之旅
2022/06/22
1880
107. 二叉树的层序遍历 II
给你二叉树的根节点 root ,返回其节点值 「自底向上的层序遍历」 。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。
chuckQu
2022/08/19
1380
LeetCode——二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1:
有礼貌的灰绅士
2023/04/17
2070
LeetCode——二叉树的层序遍历
Leetcode: Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
卡尔曼和玻尔兹曼谁曼
2019/01/22
3050
leetcode 每日一题:103.二叉树的锯齿形层序遍历
leetcode 每日一题:103.二叉树的锯齿形层序遍历:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/
用户7685359
2020/12/23
6030
Leetcode No.107 二叉树的层序遍历 II(BFS)
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
week
2021/11/29
4590
二叉树层序遍历
二叉树层序遍历是一种广度优先的遍历方式,它从二叉树的根节点开始,逐层遍历二叉树的各个节点,直到遍历完所有节点为止。在层序遍历中,我们按照从上到下、从左到右的顺序依次访问每个节点。
GeekLiHua
2025/01/21
1060
推荐阅读
相关推荐
LeetCode笔记:102. Binary Tree Level Order Traversal
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验