剑指 Offer 32 - II. 从上到下打印二叉树 II

58 阅读2分钟

前言:剑指offer刷题系列

问题:

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

示例:

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

image-20230913125639284.png

思路:

这是一个遍历打印二叉树的题,需要知道python中树是如何存储的,树可以用列表存储和链表存储。

我首先判断根结点是否为空,如果为空,就不用判断了,可以直接返回空列表。第一次写没有考虑到这一点,后面才想到的。

若不为空,就创建一个队列queue,并将根结点入队,然后再创建一个结果列表,用来存储层序遍历的结果,当队列不为空时,可以执行以下操作:

创建一个临时列表temp,用来存储当前层的结点的值。然后就去获取队列的长度len(queue),用来表示当前层的结点个数。循环遍历队列中的结点,每次出队一个结点,并将其值添加到临时列表中。如果该结点有左孩子,就将左孩子入队。如果该结点有右孩子,就将右孩子入队。然后将临时列表添加到结果列表中。最后返回结果列表。

时间复杂度:O(n),其中 n 为二叉树的节点个数。 空间复杂度:O(n)。满二叉树(每一层都填满)最后一层有大约 n/2 个节点,因此数组中最多有 O(n)个元素,所以空间复杂度是 O(n) 的。

基于上述思考,代码如下:

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        queue = [root]
        result = []
        while queue:
            temp = []
            size = len(queue)
            for _ in range(size):
                node = queue.pop(0)
                temp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            result.append(temp)
        return result

执行结果如下图:

image-20230913130057655.png

学到的知识点:

学习了树在python中的表示,本题是通过节点和引用表示法:这种方法是用一个类来定义一个树节点,类中有三个属性:节点的值,左子树的引用,右子树的引用。这种方法更灵活,可以节省空间,因为只需要为每个节点分配一个对象的空间。