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;
}

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

相关推荐
地平线开发者4 分钟前
不是线程越多越快:用 hrt_model_exec 在 征程6M 上给 YOLOv5x 建立性能基线
算法
工具派13 分钟前
Agent 不是玄学:用 Java 状态机思维理解 LangGraph
java·人工智能·python
十年Java程序媛22 分钟前
String / StringBuilder / StringBuffer|别再乱用字符串拼接,底层原理一次讲透
java·spring boot·后端
傲世仙尊24 分钟前
类和对象中-构造函数与析构函数把初始化清理自动化
java·运维·自动化
她的男孩26 分钟前
权限通了、列表有数,一点分页就炸Forge Admin 用 COUNT(1) 扛住复杂待办
java·spring boot·mybatis
骑着蜗牛撵大象32732 分钟前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
姜鱼问生41 分钟前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
憧憬成为java架构高手的小白42 分钟前
langchain4j手敲理解
java·langchain
垆边人似月.1 小时前
华为题:全排列
算法·深度优先·图论
杜 硕1 小时前
快速排序详解01
数据结构·算法·排序算法