LeetCode103. 二叉树的锯齿形层序遍历

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

示例 1:

输入:root = 3,9,20,null,null,15,7

输出:\[3,20,9,15,7]

示例 2:

输入:root = 1

输出:\[1]

示例 3:

输入:root = \[\]

输出:\[\]


解决思路:

使用两个栈来实现功能,一个全局栈global,一个局部栈temp,此外设置一个标志位label来判断在每一层时保存孩子的顺序

使用全局栈来进行遍历输出节点,在输出的同时将左右孩子节点存入局部栈中。

当每一层遍历完毕之后,将局部栈克隆给全局栈,此时全局栈具有下一层的节点。

每当遍历一层之后,更换保存孩子的顺序,如下图所示:

由于需要遍历节点,所以时间复杂度为O(n)
代码如下:

java 复制代码
package 二叉树;

import java.util.*;

public class LeetCode103二叉树的锯齿层序遍历 {

    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val,  TreeNode left,  TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    public static void main(String[] args){
        TreeNode root=new  TreeNode(3);
        TreeNode node1=new  TreeNode(9);
        TreeNode node2=new  TreeNode(20);
        TreeNode node3=new  TreeNode(15);
        TreeNode node4=new  TreeNode(7);
        TreeNode node5=new  TreeNode(2);
        TreeNode node6=new  TreeNode(1);
        root.left=node1;
        root.right=node2;
        node2.left=node3;
        node2.right=node4;
        node1.right=node5;
        node1.left=node6;
        //定义层序遍历
        List<List<Integer>> result=new ArrayList<>();
        //使用栈
        Stack<TreeNode> global=new Stack<>();
        global.push(root);
        int label=0;
        while(!global.isEmpty()){
            int size=global.size();
            List<Integer> temp_list=new ArrayList<>();
            Stack<TreeNode> temp_stack=new Stack<>();
            for(int i=0;i<size;i++){
                TreeNode child=global.peek();
                global.pop();
                temp_list.add(child.val);
                if(label==0){
                    if(child.left!=null) temp_stack.push(child.left);
                    if(child.right!=null) temp_stack.push(child.right);
                }else{
                    if(child.right!=null) temp_stack.push(child.right);
                    if(child.left!=null) temp_stack.push(child.left);
                }
            }
            //将temp_stack中的对象克隆给global
            global= (Stack<TreeNode>) temp_stack.clone();
            temp_stack.clear();
            result.add(temp_list);
            if(label==0){
                label=1;
                continue;
            }
            if(label==1){
                label=0;
            }
        }

        System.out.println(result);
    }

}
相关推荐
宸津-代码粉碎机4 分钟前
Java面试核心:JVM三大GC垃圾回收算法原理与生产场景落地分析
java·大数据·人工智能·python·spring
Ivanqhz6 分钟前
BPE(Byte Pair Encoding) 算法
java·服务器·网络·深度学习·神经网络
愛芳芳10 分钟前
Swagger2 多环境动态配置实战指南
java·后端·maven·springboot·swagger
huaweichenai13 分钟前
spring boot实现任务异步处理(队列)
java·spring boot
MZA66617 分钟前
实战:基于 XXL-JOB + 策略模式 + Nacos 配置化的 CSV 导出任务系统设计
java·spring boot·mybatis
邪修king22 分钟前
Re:Linux 系统篇(二十九):动静态库Chapter2:动态库深度辨析 —— 核心本质、制作流程、双阶段查找模型与排错指南
android·java·linux·开发语言
空空潍23 分钟前
2026年软考中级软件设计师(二):数据结构
数据结构·软考·软件设计师·软设
泡海椒1 小时前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
Bs_MoneyMagnet4 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
不会就选b8 小时前
算法日常・每日刷题--<贪心>14
算法