day150—数组—二叉树的锯齿形层序遍历(LeetCode-103)

题目描述

给你二叉树的根节点 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

解决方案:

这段代码的核心功能是实现二叉树的锯齿形层序遍历(之字形遍历) (即第一层从左到右,第二层从右到左,第三层再从左到右,以此类推交替遍历),在普通层序遍历的基础上增加了 "偶数层反转结果" 的逻辑,时间复杂度 O(n)n 为节点数),空间复杂度 O(n),是该问题的经典迭代解法。

核心逻辑

代码在普通层序遍历(双数组模拟 BFS)的基础上,通过一个布尔标记控制 "是否反转当前层节点值数组",实现锯齿形效果:

  1. 边界处理:若根节点为空,直接返回空数组;
  2. 初始化容器与标记
    • 保留普通层序遍历的 ans(最终结果)、cur(当前层节点)、nxt(下一层节点)、value(当前层节点值);
    • 新增布尔变量 even(初始为 false),标记当前层是否为 "需要反转的偶数层"(第一层不反转,第二层反转,以此类推);
  3. 逐层遍历循环
    • 与普通层序遍历一致:遍历当前层节点,收集值到 value,并按左→右顺序收集下一层节点到 nxt
    • 核心新增逻辑:若 eventrue(当前是偶数层),调用 reverse 反转 value 数组,实现从右到左的遍历效果;
    • 将处理后的 value 加入 ans,更新 cur 为下一层节点,并翻转 even 的值(切换下一层的遍历方向);
  4. 返回结果 :遍历完成后,ans 中按锯齿形存储了各层节点值,直接返回即可。

总结

  1. 核心思路:在普通层序遍历的基础上,通过布尔标记 + 数组反转实现锯齿形,无需改变节点遍历顺序,仅调整结果数组的顺序,逻辑简洁;
  2. 关键细节:even 初始为 false(第一层不反转),每遍历完一层就翻转 even,保证奇偶层交替反转;
  3. 效率特点:整体时间 O(n)(反转操作的总时间为 O(n),所有节点仅遍历一次),空间开销与普通层序遍历一致,是最优解法之一。

函数源码:

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(!root)   return {};
        vector<vector<int>>ans={};
        vector<TreeNode*>cur={root};
        vector<TreeNode*>nxt={};
        vector<int>value={};
        bool even=false;
        while(!cur.empty()){
            value={};
            nxt={};
            for(auto i:cur){
                value.push_back(i->val);
                if(i->left) nxt.push_back(i->left);
                if(i->right)nxt.push_back(i->right);                
            }
            if(even) reverse(value.begin(),value.end());
            ans.push_back(value);
            cur=nxt;
            even=!even;
        }
        return ans;
    }
};
相关推荐
华农DrLai5 分钟前
什么是远程监督?怎么自动生成训练数据?
人工智能·算法·llm·prompt·知识图谱
计算机安禾6 分钟前
【数据结构与算法】第16篇:串(String)的定长顺序存储与朴素模式匹配
c语言·数据结构·c++·学习·算法·visual studio code·visual studio
AI科技星15 分钟前
基于v≡c公设的理论优化方案
c语言·开发语言·算法·机器学习·数据挖掘
江不清丶16 分钟前
垃圾收集算法深度解析:从标记-清除到分代收集的演进之路
java·jvm·算法
副露のmagic17 分钟前
链表章节 leetcode 思路&实现
数据结构·leetcode·链表
wanderist.1 小时前
从Nim游戏到SG函数
c++·算法·蓝桥杯
数据皮皮侠1 小时前
2285 上市公司组织衰退程度【Dec】2010-2024
大数据·人工智能·算法·制造
daxi1501 小时前
C语言从入门到进阶——第17讲:字符串函数
c语言·开发语言·算法·蓝桥杯
wljy11 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯
CoderCodingNo1 小时前
【GESP】C++八级考试大纲知识点梳理 (7) 算法的时间和空间效率分析
开发语言·c++·算法