📜  门| GATE-CS-2015(套装1)|第 42 题(1)

📅  最后修改于: 2023-12-03 15:42:17.719000             🧑  作者: Mango

题目描述

给定一棵二叉树,按照层次遍历的顺序依次打印出每个结点的值。每一层打印到一行。

函数签名
def print_level_order(root: TreeNode) -> List[List[int]]:
    pass
输入格式
  • root(树的根结点):二叉树的结点,类型为TreeNode

TreeNode结构如下所示。

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
输出格式
  • result(返回值):存储按层次遍历的结果(每层为一个列表),类型为List[List[int]]
示例
root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)

print(print_level_order(root))

输出:

[[3], [9, 20], [15, 7]]
解题思路

层次遍历是一种广度优先搜索(BFS)的算法,可以使用队列来实现。我们一层层地遍历整棵树,把每一层的结点添加到队列中。然后遍历队列中的元素,将每次取出的元素的值存储到当前层的列表中。当队列为空时,遍历结束。

代码实现
from typing import List

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

def print_level_order(root: TreeNode) -> List[List[int]]:
    if not root:
        return []

    queue = [root]  # 存储待遍历的结点
    result = []  # 存储层次遍历的结果

    while queue:
        level_list = []  # 存储当前层的结点值
        level_size = len(queue)  # 当前层结点的个数

        for i in range(level_size):
            node = queue.pop(0)
            level_list.append(node.val)

            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

        result.append(level_list)

    return result

时间复杂度:$O(n)$,其中n为二叉树中结点的个数。

空间复杂度:$O(m)$,其中m为二叉树的最大宽度。在最坏情况下,队列中的元素个数可以达到$\frac{m}{2}$,即树的倒数第二层的结点数。