2024.2.16力扣每日一题——二叉树的锯齿形层序遍历

2024.2.16

题目来源

力扣每日一题;题序:103

我的题解

方法一 双端队列+标志

层序遍历 利用双端队列和标志,判断当前应该往那个方向遍历

注意:在逆向遍历时,加入后续节点到队列中的顺序需要改变
时间复杂度 :O(N),其中 N 为二叉树的节点数。每个节点会且仅会被遍历一次。
空间复杂度:O(N)。需要维护存储节点的队列和存储节点值的双端队列,空间复杂度为 O(N)。

java 复制代码
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    List<List<Integer>> res=new ArrayList<>();
    if(root==null)
        return res;
    LinkedList<TreeNode> queue=new LinkedList<>();
    queue.addFirst(root);
    boolean flag=false;//false表示从右到左,true表示从左到右
    while(!queue.isEmpty()){
        int sz=queue.size();
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<sz;i++){
            //从右到左
            if(!flag){
                TreeNode t=queue.pollLast();
                list.add(t.val);
                if(t.left!=null)
                    queue.addFirst(t.left);
                if(t.right!=null)
                    queue.addFirst(t.right);
            //从左到右
            }else{
                TreeNode t=queue.pollFirst();
                list.add(t.val);
                //注意存入的顺序需要改变
                if(t.right!=null)
                    queue.addLast(t.right);
                if(t.left!=null)
                    queue.addLast(t.left);
                
                
            }
        }
        flag=!flag;
        res.add(list);
    }
    return res;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
wangbing11253 分钟前
监控网页项目常用英文缩写
java
麻瓜code7 分钟前
双写一致性:为什么是“删缓存“,而不是“改缓存“
java·缓存·mybatis
小蒜学长10 分钟前
基于SpringBoot+Vue的云南地区扶贫助农系统的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·乡村振兴
砚底藏山河18 分钟前
量化回测可复现流水线CI化
java·python·ci/cd·金融
骑着蜗牛撵大象32718 分钟前
Spring Boot 4.1 + Spring AI 2.0:RAG 供文、图谱供关系、MCP 供工具的 Java Agent 平台
java·spring boot·spring·微服务·知识图谱·rag·mcp
hetao173383731 分钟前
2026-11-02 hetao1733837 的刷题记录
c++·算法
Geektec34 分钟前
IMU 选型完全指南:从硬件参数到算法融合的系统工程视角
算法·imu·陀螺仪·加速度计·元器件选型
CQU_JIAKE38 分钟前
11.2【A】
算法
衍生星球38 分钟前
【Java 语言】— 面向对象:构造方法(无参、有参构造)
java·开发语言
SimonKing40 分钟前
素笺( local-notes)全面优化,新增功能体验不一样的笔记
java·后端·程序员