103. 二叉树的锯齿形层序遍历

Problem: 103. 二叉树的锯齿形层序遍历

🐷我的leetcode主页

文章目录

题目

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

输入:root = [3,9,20,null,null,15,7]

输出:[[3],[20,9],[15,7]]

示例 2:

输入:root = [1]

输出:[[1]]

示例 3:

输入:root = []

输出:[]

提示:

树中节点数目在范围 [0, 2000] 内

-100 <= Node.val <= 100

分类

迭代,递归,广度优先遍历

思路

和102一样,只是需要多判断一个条件标志位,用于切换左右顺序

因为root节点可以看做是从左到右,所以标志位的初始值为True,表示从左到右遍历

如果本次是False,从右到左,则在每一层的队列中追加元素时,追加到队列的开头

如果本次是True,从左到右,则在每一层的队列中追加元素时,追加到队列的结尾

解题方法

迭代

时间复杂度

O ( n ) O(n) O(n)

Code

python 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def zigzagLevelOrder(self, root: [TreeNode]) :
        """
        迭代
        """
        if not root:
            return []
        res = []
        queue = [root]
        # 一个标志位,用于切换左右顺序,False:表示右到左,True:表示左到右
        flag = True
        while queue:
            size = len(queue)
            level = []
            for i in range(size):
                q = queue.pop(0)
                # 当前层标志位为false,在队列开头插入元素
                if flag == False:
                    level.insert(0,q.val)
                # 当前层标志位为true,在队列结尾插入元素
                else:
                    level.append(q.val)
                if q.left:
                    queue.append(q.left)
                if q.right:
                    queue.append(q.right)
            # 每一层遍历结束后,翻转标志位
            flag = not flag
            res.append(level)
        return res

递归

奇数层在队列开始插入元素,偶数层在队列结尾插入元素

用depth和2取余判断当前是奇数层还是偶数层

时间复杂度

O ( n ) O(n) O(n)

Code

python 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def zigzagLevelOrder(self, root: [TreeNode]) :
        """
        递归
        """
        if not root:
            return []
        res = []
        def dfs(node,depth):
            if not node:
                return
            if len(res)==depth:
                res.append([])
            # 当前层标志位为false(即当前为奇数层),在队列开头插入元素
            if depth % 2 != 0:
                res[depth].insert(0,node.val)
            # 当前层标志位为true(即当前为偶数层),在队列结尾插入元素
            else:
                res[depth].append(node.val)
            dfs(node.left,depth+1)
            dfs(node.right,depth+1)
        dfs(root,0)
        return res            
相关推荐
明如正午3 小时前
转换pdf文件为md文件【markitdown+pdf4llm】
python·pdf·markitdown·pdf4llm
MegaDataFlowers3 小时前
快速算法验证流水线
算法
咯哦哦哦哦3 小时前
Foundationpose环境配置【非conda--纯UV】(linux22.04+python3.10)
python·pip·uv
Aaron15883 小时前
27DR/47DR/67DR技术对比及应用分析
人工智能·算法·fpga开发·硬件架构·硬件工程·信息与通信·基带工程
alphaTao3 小时前
LeetCode 每日一题 2026/4/27-2026/5/3
算法·leetcode
AC赳赳老秦3 小时前
项目闭环管理:用 OpenClaw 对接 Jira / 禅道,实现需求 - 任务 - 进度 - 验收全流程自动化
运维·人工智能·python·自动化·devops·jira·openclaw
fillwang3 小时前
间接料库存预警报告设计
python·rpa
穿越临界点3 小时前
动态规划(DP)
算法·动态规划·贝尔曼
木木_王3 小时前
嵌入式Linux学习 | 数据结构(Day06)全解:线性表 + 栈队列 + 静态库 / 动态库(原理 + 代码 + 编译实战 + 易错点)
linux·数据结构·笔记·学习
.柒宇.3 小时前
AI 掘金头条项目-新闻模块实现
数据库·后端·python·fastapi