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            
相关推荐
测试19983 分钟前
Pytest中实现自动生成测试用例脚本代码
自动化测试·软件测试·python·测试工具·测试用例·pytest·接口测试
唐叔在学习3 分钟前
Python NumPy入门指南:数据处理科学计算的瑞士军刀
python·数据分析·numpy·数组操作·python数据处理
屁股割了还要学1 小时前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代1 小时前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
让心淡泊1442 小时前
DAY 37 早停策略和模型权重的保存
python
阿彬爱学习2 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain3 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
批量小王子3 小时前
2025-08-09通过授权码的方式给exe程序充值
笔记·python
mortimer3 小时前
pydub下音频处理:跨越wav格式的4GB限制这道坎
python·ffmpeg·numpy
Dxy12393102163 小时前
Python合并两个PDF文件
python·pdf