LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

这篇具有很好参考价值的文章主要介绍了LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LetMeFly】103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

力扣题目链接:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/

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

 

示例 1:

LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转,题解,# 力扣LeetCode,leetcode,算法,题解,二叉树,层序遍历
输入: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

方法一:层序遍历 + 适时翻转

前言

相信大家已经做过关于层序遍历的练习了,没有做过的建议先做一做,可以参考这篇题解:LeetCode 102.二叉树的层序遍历 + 针对C++的使用空间优化 (可能不同于常规做法)

思路

这道题与之不同的是,每隔一层需要变化一下遍历方向。

真的要变换遍历方向吗?其实不然:

我们只需要在正常遍历的基础上使用一个变量来记录当前这一层是否需要翻转,若需翻转则在这一层遍历结束后reverse一下最后一层即可。

  • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是节点个数
  • 空间复杂度 O ( N 2 ) O(N2) O(N2),其中 N 2 N2 N2是节点最多的一层的节点数

AC代码

C++
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        bool ifReverse = false;
        queue<TreeNode*> q;
        if (root) {
            q.push(root);
        }
        while (q.size()) {
            ans.push_back({});
            for (int _ = q.size(); _ > 0; _--) {
                TreeNode* thisNode = q.front();
                q.pop();
                ans.back().push_back(thisNode->val);
                if (thisNode->left) {
                    q.push(thisNode->left);
                }
                if (thisNode->right) {
                    q.push(thisNode->right);
                }
            }
            if (ifReverse) {
                reverse(ans.back().begin(), ans.back().end());
            }
            ifReverse = !ifReverse;
        }
        return ans;
    }
};
Python
# from typing import List, Optional

# # Definition for a binary tree node.
# 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: Optional[TreeNode]) -> List[List[int]]:
        ans = []
        ifReverse = False
        q = []
        if root:
            q.append(root)
        while q:
            ans.append([])
            for _ in range(len(q)):
                thisNode = q[0]
                q = q[1:]
                ans[-1].append(thisNode.val)
                if thisNode.left:
                    q.append(thisNode.left)
                if thisNode.right:
                    q.append(thisNode.right)
            if ifReverse:
                ans[-1].reverse()
            ifReverse = not ifReverse
        return ans

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/136126902文章来源地址https://www.toymoban.com/news/detail-828397.html

到了这里,关于LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【LeetCode热题100】--102.二叉树的层序遍历

    【LeetCode热题100】--102.二叉树的层序遍历

    广度优先搜索: 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键

    2024年02月07日
    浏览(27)
  • 每日一题:LeetCode-102.二叉树的层序遍历

    每日一题:LeetCode-102.二叉树的层序遍历

    前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈    🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉 算法 👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长

    2024年02月05日
    浏览(16)
  • leetcode做题笔记107. 二叉树的层序遍历 II

    leetcode做题笔记107. 二叉树的层序遍历 II

    给你二叉树的根节点  root  ,返回其节点值  自底向上的层序遍历  。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 本题要求二叉树的层序遍历,并且是从下至上的层序遍历,可以考虑先按照从上至下的层序遍历先将层序遍历结果放到数组中,再对每层

    2024年02月11日
    浏览(13)
  • LeetCode 2641. 二叉树的堂兄弟节点 II:层序遍历并记下兄弟节点

    LeetCode 2641. 二叉树的堂兄弟节点 II:层序遍历并记下兄弟节点

    力扣题目链接:https://leetcode.cn/problems/cousins-in-binary-tree-ii/ 给你一棵二叉树的根  root  ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和  。 如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟  。 请你返回修改值之后,树的根   root

    2024年02月20日
    浏览(8)
  • 【Py/Java/C++三种语言详解】LeetCode每日一题240216【二叉树BFS】LeetCode103、二叉树的层序遍历II

    【Py/Java/C++三种语言详解】LeetCode每日一题240216【二叉树BFS】LeetCode103、二叉树的层序遍历II

    有LeetCode交流群/华为OD考试扣扣交流群可加: 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336 了解算法冲刺训练 LeetCode103、二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进

    2024年02月20日
    浏览(12)
  • 代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

    代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

    本文思路和详细讲解来自于:代码随想录 (programmercarl.com) 题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode) 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建队列,向里加入root元素,计算队列的长度,也就是每一层的元素个数,while循环,si

    2024年02月06日
    浏览(12)
  • ★102. 二叉树的层序遍历

    ★102. 二叉树的层序遍历

    很巧妙的,又学习了一种层次遍历的方法, 就是说根据当前的队列的长度去遍历,遍历的当前队列的长度就是该层次的节点个数。

    2024年02月05日
    浏览(16)
  • 41 二叉树的层序遍历

    41 二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 提示: 树中节点数目在范围 [0, 2000] 内 -1000 = Node.val = 1000

    2024年02月07日
    浏览(14)
  • 二叉树题目:二叉树的层序遍历 II

    二叉树题目:二叉树的层序遍历 II

    标题:二叉树的层序遍历 II 出处:107. 二叉树的层序遍历 II 4 级 要求 给你二叉树的根结点 root texttt{root} root ,返回其结点值自底向上的层序遍历(即从左到右,按从叶结点所在层到根结点所在层逐层遍历)。 示例 示例 1: 输入: root   =   [3,9,20,null,null,15,7] texttt{root = [3

    2024年02月11日
    浏览(12)
  • 二叉树的遍历(节点个数及层序遍历)

    二叉树的遍历(节点个数及层序遍历)

     简易树的图形:    运行实例: 以A节点开始运算的节点个数 以B节点开始运算的节点个数 解释(图解+文字解释):  把A传过去A不为空,进入left,A的left为B不为空,B的left为D不为空,D的left和right都为空返回0+0+1,在进入B的right,B的right为E不为空,E的left和right都为空返回

    2023年04月22日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包