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            
相关推荐
一直学习永不止步2 分钟前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
兆。2 分钟前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
小刘|34 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
南宫理的日知录36 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
jjyangyou38 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
coberup1 小时前
django Forbidden (403)错误解决方法
python·django·403错误
van叶~1 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
简简单单做算法1 小时前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫