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

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

相关推荐
Mr-Wanter12 分钟前
wsl2 jdk管理工具之sdkman
java·开发语言·sdkman
地平线开发者26 分钟前
征程 6E/M Matrix 开发评板使用系列(一):开箱与点亮
算法·自动驾驶
唐青枫42 分钟前
Java Future 与 CompletableFuture 实战指南:从异步结果到任务编排
java
Jerry43 分钟前
LeetCode 59. 螺旋矩阵 II
算法
长孙豪翔1 小时前
在.net中读写config文件的各种方法
java·数据库·.net
tachibana21 小时前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
可编程芯片开发1 小时前
基于FOC控制器的BLDC无刷直流电机控制系统matlab编程与仿真
算法
可乐ea1 小时前
【Java八股|第10篇】Java 中的包装类和自动拆装箱
java·面试题·包装类·java八股
zfoo-framework1 小时前
mongo最佳实战(from mongo中文社区)
java
aaaameliaaa1 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法