Leetcode 102 二叉树的层序遍历

二叉树的层序遍历

题目

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

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

解答

  • 思路:

    • 采用图的BFS遍历的思想对树进行逐层遍历;
    • 用queue来实现BFS;(由于这边是树型结构,所以不会有环路,故不需要用visited来记录哪些节点已经访问过)
    • 为了记录当前遍历的节点在哪一层,我们用两个变量curLevelNum和nextLevelNum来分别记录当前层次还有多少没有遍历,以及下一层次还有多少没有遍历。
  • 代码:

    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        """
        :type root: TreeNode
        :rtype List[List[int]]
    
        (knowledge)
    
        思路:
        1. 采用图的BFS遍历的思想对树进行逐层遍历;
        2. 用queue来实现BFS;(由于这边是树型结构,所以不会有环路,故不需要用visited来记录哪些节点已经访问过)
        3. 为了记录当前遍历的节点在哪一层,我们用两个变量curLevelNum和nextLevelNum来分别记录当前层次还有多少没有遍历,以及下一层次还有多少没有遍历
    
        tip: ppt中用的是DFS的方法,那种方法可以更容易的记录当前节点所属层级
        """
    
        # 特判树为空的情况
        if not root:
            return []
    
        # 初始时curLevelNum = 1表示要遍历的第一层为根节点只有一个
        # 初始时nextLevelNum = 0,当遍历节点时,会增加下一层的可遍历节点数量
        curLevelNum, nextLevelNum = 1, 0
        result = [[]]
        queue = collections.deque([root])
    
        while queue:
            curNode = queue.popleft()
            result[-1].append(curNode.val)
            curLevelNum -= 1
    
            # 判断当前节点的左右节点是否存在,存在则入队
            if curNode.left:
                queue.append(curNode.left)
                nextLevelNum += 1
            if curNode.right:
                queue.append(curNode.right)
                nextLevelNum += 1
    
            if curLevelNum == 0:  # 判断是否换层
                curLevelNum, nextLevelNum = nextLevelNum, 0
                # 如果下一层还有可遍历的节点,则往结果集里面新加一个空列表用来存储下一层的遍历结果
                if curLevelNum != 0:
                    result.append([])
    
        return result
    

测试验证

from typing import List
import collections


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

    def __repr__(self):
        if self:
            return "{}->{}->{}".format(self.val, repr(self.left), repr(self.right))


class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        """
        :type root: TreeNode
        :rtype List[List[int]]

        (knowledge)

        思路:
        1. 采用图的BFS遍历的思想对树进行逐层遍历;
        2. 用queue来实现BFS;(由于这边是树型结构,所以不会有环路,故不需要用visited来记录哪些节点已经访问过)
        3. 为了记录当前遍历的节点在哪一层,我们用两个变量curLevelNum和nextLevelNum来分别记录当前层次还有多少没有遍历,以及下一层次还有多少没有遍历

        tip: ppt中用的是DFS的方法,那种方法可以更容易的记录当前节点所属层级
        """

        # 特判树为空的情况
        if not root:
            return []

        # 初始时curLevelNum = 1表示要遍历的第一层为根节点只有一个
        # 初始时nextLevelNum = 0,当遍历节点时,会增加下一层的可遍历节点数量
        curLevelNum, nextLevelNum = 1, 0
        result = [[]]
        queue = collections.deque([root])

        while queue:
            curNode = queue.popleft()
            result[-1].append(curNode.val)
            curLevelNum -= 1

            # 判断当前节点的左右节点是否存在,存在则入队
            if curNode.left:
                queue.append(curNode.left)
                nextLevelNum += 1
            if curNode.right:
                queue.append(curNode.right)
                nextLevelNum += 1

            if curLevelNum == 0:  # 判断是否换层
                curLevelNum, nextLevelNum = nextLevelNum, 0
                # 如果下一层还有可遍历的节点,则往结果集里面新加一个空列表用来存储下一层的遍历结果
                if curLevelNum != 0:
                    result.append([])

        return result


if __name__ == '__main__':
    solution = Solution()
    root = TreeNode(3)
    root.left = TreeNode(9)
    root.right = TreeNode(20)
    root.right.left = TreeNode(15)
    root.right.right = TreeNode(7)
    print(solution.levelOrder(root), "= [[3], [9, 20], [15, 7]]")

你可能感兴趣的:(Leetcode 102 二叉树的层序遍历)