LeetCode(力扣) 102题:二叉树的层序遍历----BFS求解附带详细注释

题目描述

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

示例

二叉树:[3,9,20,null,null,15,7]
在这里插入图片描述
返回结果:[ [3], [9,20], [15,7] ]

问题分析

在我印象里,二叉树的题目多半与DFS (深度优先搜索)、BFS (广度优先搜索)、递归等相关,大家在刷题的时候我也建议养成这种习惯,看到特定类型的题目首先往特定方法上靠。看到题目描述中 “逐层地,从左到右访问所有节点”, 从左到右想到广度优先搜索,在每一层用广度遍历二叉树的元素。

代码流程

这里是用队列来储存某一层二叉树的所有节点(顺序为从左到右),我也是第一次使用列表存储节点,初始条件便是存储根节点,然后定义一个临时列表next_level存放下一层所有节点。我们要先把队列里所有节点的值存储到结果中,然后再把下一层的节点存储在临时列表next_level中,再把next_level赋值给队列。直到遍历完二叉树的最后一层结束。

代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        # 首先判断根节点为空的情况
        if not root:
            return []
        # 这道二叉树的题目因为是要层序遍历, 每层都要遍历所有的元素, 推荐使用BFS
        # 使用队列保存当前层的二叉树结点, 初始时候根节点放入队列,遍历二叉树的第一层
        queue = [root]
        # 定义储存结果的列表
        res = []
        # 知道二叉树某一层为空(即最后一层已经遍历完), 则跳出循环
        while queue:
            # 定义储存下一层节点的列表
            next_level = []
            # 首先将本层的节点值遍历存储
            res.append([item.val for item in queue])
            # 然后将下一层的节点放入列表
            for item in queue:
                if item.left:
                    next_level.append(item.left)
                if item.right:
                    next_level.append(item.right)
            # 下一层的节点放入队列
            queue = next_level
        # 返回结果
        return res

        

运行结果

LeetCode(力扣) 102题:二叉树的层序遍历----BFS求解附带详细注释_第1张图片

你可能感兴趣的:(LeetCode,二叉树,队列,列表,leetcode,二叉树层序遍历)