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            
相关推荐
朝朝辞暮i2 分钟前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
淡海水25 分钟前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
言乐632 分钟前
Python语音检索
开发语言·python·django·virtualenv·pygame
平行侠37 分钟前
065 B树(B-Tree)
数据结构·b树·树查找
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 1 篇):指数列表与实时行情接入
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
happylifetree1 小时前
Python34-35:核心语法-流程控制语句-循环-综合案例
python
吃饱了得干活1 小时前
Agent 的记忆与工具:从上下文窗口到 MCP
python·agent·mcp
无忧.芙桃1 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法
乐迪信息2 小时前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉
燐妤2 小时前
LangGraph-复习总览
python·ai·面试·agent·学习方法·langgraph