Leetcode刷题:剑指offer【面试题32-2 分行从上到下打印二叉树】

文章目录

【面试题32-2 分行从上到下打印二叉树】

难度: 简单

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

Leetcode题目对应位置: 面试题32-2:分行从上到下打印二叉树

思路:由于要分层打印,每次入队后求一下队列的长度,仅将长度内(同一层)的节点放在一个列表里,就能实现分层打印啦。

代码逻辑

  • 初始化一个包含根节点的队列 queue,空的结果列表 res
  • 获取当前队列长度(当前层节点个数),循环执行队首元素出队,将队首元素值添加到临时列表 layer 尾部,向 queue 中添加队首元素的左右子节点(若不为空)
  • 将 layer 添加到结果列表 res 的尾部

特殊值处理:当输入树的根节点为空时,直接返回空列表 []

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

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, queue = [], [root]
        while queue:
            n = len(queue)
            layer = []
            for _ in range(n):  # print layer
                t = queue.pop(0)  # 时间复杂度:O(n)
                layer.append(t.val)
                if t.left: queue.append(t.left)
                if t.right: queue.append(t.right)
            res.append(layer)
        return res

同样可以用双端队列进行优化,使出队列的时间复杂度为 O(1)。

时间复杂度:O(n),遍历节点个数为 n 的二叉树
空间复杂度:O(n),最差情况下(平衡二叉树),同时有 n/2 个节点同时在 queue 中

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

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, queue = [], collections.deque()  # 双端队列
        queue.append(root)
        while queue:
            tmp = []
            for _ in range(len(queue)):
                node = queue.popleft()  # 时间复杂度:O(1)
                tmp.append(node.val)
                if node.left: queue.append(node.left)
                if node.right: queue.append(node.right)
            res.append(tmp)
        return res

代码来源:mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃饭就会放大招

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值