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            
相关推荐
a9511416421 分钟前
golang如何设计分布式ID生成系统_golang分布式ID生成系统设计指南
jvm·数据库·python
2301_782659181 分钟前
Go 中高效过滤结构体切片:基于用户名映射去重的最优实践
jvm·数据库·python
2301_813599551 分钟前
Golang怎么处理HTTP响应_Golang HTTP响应处理教程【对比】
jvm·数据库·python
Mem0rin2 分钟前
[Java/数据结构]PriorityQueue
java·数据结构
m0_748839493 分钟前
C#怎么将集合分块处理_C#如何使用Chunk方法【实战】
jvm·数据库·python
21439654 分钟前
Bootstrap制作后台管理系统布局 Bootstrap如何搭建Dashboard框架
jvm·数据库·python
吕源林5 分钟前
Python爬虫怎么获取动态AJAX数据_从浏览器网络控制台分析接口
jvm·数据库·python
m0_716765238 分钟前
数据结构--栈的插入、删除、查找详解
开发语言·数据结构·c++·经验分享·学习·青少年编程·visual studio
阿Y加油吧9 分钟前
从斐波那契到动态规划:两道入门题吃透 DP 核心思想
算法·动态规划·代理模式
m0_640309309 分钟前
C#怎么实现单例模式 C#如何正确实现线程安全的Singleton单例设计模式【设计模式】
jvm·数据库·python