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

本文探讨了两种优化二叉树层次遍历的方法。方法一是利用层序遍历,通过判断当前层数的奇偶性来决定输出顺序。方法二是将奇偶层逻辑分离,分别处理,避免了重复的奇偶判断,提高了效率。这两种方法都涉及到双端队列的使用,以实现灵活的节点出队和入队策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

方法一

依旧按每层从左到右的顺序保存和输出,另设置layer变量指示当前层数,若为偶数层则顺序,奇数层则逆序

# 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)
        layer = 0   # 当前的层数
        while queue:
            tmp = []
            for _ in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                tmp.append(node.val)
            if layer % 2 == 0:
                res.append(tmp)
            else:
                res.append(tmp[::-1])
            layer += 1
        return res

在这里插入图片描述
在这里插入图片描述

方法二:层序遍历 + 双端队列(奇偶层逻辑分离)

参考解法
方法一代码简短、容易实现;但需要判断每个节点的所在层奇偶性,即冗余了 N N N 次判断。
通过将奇偶层逻辑拆分,可以消除冗余的判断。

# 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 = []
            # 偶数层(从0开始)
            for _ in range(len(queue)):
                # 从左边出队列
                node = queue.popleft()
                tmp.append(node.val)
                # 从左往右入队列
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(tmp)
            # 进行完一层后先做判断,如果为空则结束
            if not queue:
                break
            tmp = []
            # 奇数层
            for _ in range(len(queue)):
                # 从右边出队列
                node = queue.pop()
                tmp.append(node.val)
                # 从右往左从左端入队列,
                if node.right:
                    queue.appendleft(node.right)
                if node.left:
                    queue.appendleft(node.left)
            res.append(tmp)
        return res

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值