Java——按之字形顺序打印二叉树

news2025/1/15 20:51:30

题目链接

牛客在线oj题——按之字形顺序打印二叉树

题目描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:0≤n≤1500,
树上每个节点的val满足 ∣val∣<=1500
要求:空间复杂度:O(n),时间复杂度:O(n)

例如:
给定的二叉树是{1,2,3,#,#,4,5}
在这里插入图片描述
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]

题目示例

示例1

输入:
{1,2,3,#,#,4,5}

返回值:
[[1],[3,2],[4,5]]

说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。

示例2

输入:
{8,6,10,5,7,9,11}

返回值:
[[8],[10,6],[5,7,9,11]]

示例3

输入:
{1,2,3,4,5}

返回值:
[[1],[3,2],[4,5]]

思路一

定义一个栈stack和一个队列queue,boolean类型变量isRightToLeft = true,将根节点入栈

每次循环前创建ArrayList的list变量,用来存储每一层遍历的元素。确定当前栈的元素个数size(就是当前层所有元素的个数)。

从栈中取出元素,将该元素的值添加进list中,如果当前是需要从右到左遍历,那么先向queue存入当前节点的左子树,再存入右子树。否则先存入当前节点的右子树,再存入左子树(因为栈是先入后出,所以left应该被后遍历时应该被先压入栈)

每一层遍历后对isRightToLeft取反,然后向result中添加list中的元素,再向stack中插入queue中所有元素

而之所以需要定义queue,而不能直接将元素入栈,是因为由于栈是后入先出的,所以添加元素后会影响栈的弹出顺序,所以要等到一层都遍历完后再插入栈

思路一代码

import java.util.*;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if(pRoot == null){
            return result;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        boolean isRightToLeft = true;

        stack.push(pRoot);

        while(!stack.isEmpty()){
            ArrayList<Integer> list = new ArrayList<>();
            int size = stack.size();

            while(size != 0){
                TreeNode cur = stack.pop();
                list.add(cur.val);
                TreeNode first = isRightToLeft ? cur.left : cur.right;
                TreeNode second = isRightToLeft ? cur.right : cur.left;

                if(first != null){
                    queue.add(first);
                }
                if(second != null){
                    queue.add(second);
                }
                size--;
            }

            isRightToLeft = !isRightToLeft;
            result.add(new ArrayList<>(list));
            while(!queue.isEmpty()){
                stack.add(queue.poll());
            }
        }
        return result;
    }
}

思路二

定义一个boolean类型的变量isLeftToRight,如果为true代表从左向右遍历

按照层序遍历的方法从上到下遍历二叉树,将每一层的节点存储在list中,如果isLeftToRight为false,那么就翻转list

最后将每一层的list存储在result中,直接返回即可

具体层序遍历的思路为:
定义一个队列queue,首先将根节点root进入队列,每次循环都先确定队列中元素个数size,每次弹出size个元素,这一次循环就是代表访问二叉树的一层的元素,然后再将这一层的元素的左子树和右子树(如果存在)分别加入到队列中即可

思路二代码

import java.util.*;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if(pRoot == null){
            return result;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        boolean isLeftToRight = true;
        
        queue.add(pRoot);
        while(!queue.isEmpty()){
            int size = queue.size();
            ArrayList<Integer> list = new ArrayList<>();
            
            while(size != 0){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left != null){
                    queue.add(cur.left);
                }
                if(cur.right != null){
                    queue.add(cur.right);
                }
                size--;
            }
            
            if(!isLeftToRight){
                Collections.reverse(list);
            }
            
            isLeftToRight = !isLeftToRight;
            result.add(new ArrayList<>(list));
        }
        return result;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出字符编码

本文对应视频链接&#xff1a; 深入浅出字符编码 什么是编码格式 从一个小问题引入 我们在学习C语言的时候&#xff0c;有一道必做的题目是将大写字母转换成小写&#xff0c;相信有点基础的同学都能不加思索的写出下面的代码&#xff1a; char toLower(char upper){if (up…

大数据Doris(十四):数据模型的选择建议和列定义建议

文章目录 数据模型的选择建议和列定义建议 一、数据模型的选择建议 1、Aggregate数据模型选择<

如何快速给出解释——正交矩阵子矩阵的特征值的模必然不大于1

Memory 首先快速回忆一下正交矩阵的定义&#xff1a; A为n阶实矩阵&#xff0c;且满足A‘AE或是说AA’E&#xff0c;那么A为正交矩阵。 &#xff08;啊&#xff0c;多么简洁的定义&#xff09; 其次快速想到它的性质&#xff1a; ① 实特征值必然 或 其他复数…

qt几种常见安装包制作工具-Qt Installer Framework

Qt Installer Framework&#xff08;简称&#xff1a;QtIFW&#xff09;概述 QtIFW提供了一组工具和实用程序&#xff0c;可以一次性创建安装程序&#xff0c;并在所有支持的桌面Qt平台上部署它们&#xff0c;而无需重写源代码。安装程序将在运行它们的平台上具有本机外观和感…

第四节 特殊权限SUID、SGID、SBIT

1.Set UID 简称 SUID 简称 SUID 限制与功能&#xff1a; SUID权限仅对二进制程序有效&#xff1b; 执行者对于该程序需要具有x的执行权限&#xff1b; 本权限仅在执行该程序的过程中有效&#xff1b;  执行者将具有该程序拥有者的权限 特殊权限SUID、SGID、SBIT 例&am…

【分布族谱】Zipf分布及其Python可视化

文章目录 zipf分布简介zipfian和zipf对象zipf分布到zeta分布的变化情况分布族谱图 zipf分布简介 #mermaid-svg-mG901pJXpTYFT7Bk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mG901pJXpTYFT7Bk .error-icon{fill:…

Spring Boot 如果防护 XSS + SQL 注入攻击

Spring Boot 如果防护 XSS SQL 注入攻击 XSS跨站脚本攻击XSS漏洞介绍XSS漏洞分类防护建议 SQL注入攻击SQL注入漏洞介绍防护建议mybatis是如何做到sql预编译的呢 SpringBoot中如何防止XSS攻击和sql注入创建Xss请求过滤类XssHttpServletRequestWraper把请求过滤类XssHttpServlet…

使用fork函数创建一个进程

pid_t fork(void) fork函数调用成功&#xff0c;返回两次 &#xff08;1&#xff09;返回值为0&#xff0c;代表当前进程是子进程 &#xff08;2&#xff09;返回值为非负数&#xff0c;代表当前进程是父进程 &#xff08;3&#xff09;调用失败&#xff0c;则返回-1 代码如…

【人工智能概论】 K折交叉验证

【人工智能概论】 K折交叉验证 文章目录 【人工智能概论】 K折交叉验证一. 简单验证及其缺点1.1 简单验证简介1.2 简单验证的缺点 二. K折交叉验证2.1 K折交叉验证的思路2.2 小细节2.3 K折交叉验证的缺点2.4 K折交叉验证的代码 一. 简单验证及其缺点 1.1 简单验证简介 简单验…

join 语句使用

目录 前言 创建数据 知识点补充 Join算法Index Nested-Loop 小结&#xff1a; Join算法Block Nested-Loop join_buffer放不下驱动表情况 小结&#xff1a; 小表是什么&#xff1f; 总结&#xff1a; 参考内容 前言 在实际开发中&#xff0c;我们一般会有两类问题&a…

腾讯云2核4G服务器5M带宽轻量CPU性能、流量和系统盘测试

腾讯云轻量应用服务器2核4G5M配置&#xff0c;自带5M公网带宽&#xff0c;5M带宽下载速度峰值可达640KB/秒&#xff0c;系统盘为60GB SSD盘&#xff0c;每月500GB流量包&#xff0c;折合每天16GB流量。腾讯云百科来详细说下腾讯云轻量应用服务器2核4G5M配置、CPU型号处理器主频…

威联通nas服务器中勒索病毒被encrypted勒索病毒攻击怎么办有哪些预防措施

威联通是一家专业提供网络存储设备和应用方案的公司&#xff0c;旗下NAS服务器因为实用、多功能而深受用户喜欢&#xff0c;但是NAS服务器在使用过程中也面临许多安全问题&#xff0c;例如被encrypted勒索病毒攻击。下面将为大家介绍encrypted勒索病毒在威联通NAS服务器上的危害…

黑马---Redis入门到实战【实战篇】

一、短信登录 基于session实现短信登录的流程 实现发送短信验证码功能 发送验证码功能&#xff1a; Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号if(RegexUtils.isPhoneInvalid(phone)){//2.如果不符合&#xff0c;返回错误信息return…

Java 基础进阶篇(十三)—— 异常处理机制

文章目录 一、异常概述、体系二、异常的分类三、异常的默认处理流程四、异常的处理机制4.1 编译时异常的处理机制4.1.1 方式一&#xff1a;抛出异常4.1.2 方式二&#xff1a;捕获异常4.1.3 方式三&#xff1a;前两者结合 4.2 运行时异常的处理机制 五、自定义异常5.1 自定义编译…

程序员面试金典10.*

文章目录 10.1合并排序的数组10.02变位词组10.03搜索旋转数组10.05稀疏数组搜索10.09排序矩阵查找10.10 数字流的秩10.11 峰与谷 10.1合并排序的数组 这个就从后往前加入到新数组里就行。如果B的下标是-1则结束&#xff0c;A的下标是-1则一直加B的元素。 class Solution { pub…

挑战14天学完Python---初识python基本图形绘制

往期文章 目录 往期文章前言1."Python蟒蛇绘制"实例2.Python标准库 之turtle库3. 面向对象编程风格3.1 import更多玩法3.1.1使用from和import保留字共同完成3.1.2 使用import和as保留字共同完成 4.turtle的原(wan)理 (fa)4.1 turtle绘图窗体布局---turtul.setup()4.2…

京东小程序折叠屏适配探索 | 京东云技术团队

前言 随着近年来手机行业的飞速发展&#xff0c;手机从功能机进入到智能机&#xff0c;手机屏幕占比也随着技术和系统的进步越来越大&#xff0c;特别是Android 10推出以后&#xff0c;折叠屏逐渐成为Android手机发展的趋势。 图 1 Android手机屏幕发展趋势 京东小程序近年来…

Python程序员辞职后,如何踏出自由职业的第一步,聊聊我自己的看法

大家好&#xff0c;我是兴哥。有个广州的朋友说他辞职了&#xff0c;想要自由职业该怎么开始第一步呢&#xff1f;我问他你之前的收入月薪是多少&#xff0c;他说2万出头。我不得不说&#xff0c;对于写项目的自由职业程序员&#xff0c;2万是一个极高的门槛。但既然他已经辞职…

第三十章 React的路由基本使用

关于React路由&#xff0c;我们在学习之前先了解一下其他知识点&#xff1a;SPA应用、路由的理解、react中如何使用路由。 SPA应用的理解 我们知道React脚手架给我们构建的是一个单页应用程序&#xff08;SPA&#xff09;&#xff0c;在页面加载时&#xff0c;只会加载一个HT…

2.Redis入门概述

1.Redis是什么 Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c; 是一个高性能的Key-Value数据库&#xff0c; 提供了丰富的数据结构&#xff0c;例如String、Hash、List、Set、SortedSet等等。 数据是存在内存中的&a…