【LeetCode】102.二叉树的层序遍历

news2024/9/30 23:34:13

1.问题

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

在这里插入图片描述

示例 1:

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

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

2.解题思路

2.1 队列

二叉树每层的遍历符合队列的特性,必须FIFO(first in first out),再遍历每层完成后,可以给定一个标记或者层数,表示该层已经遍历完毕,可以将此时的该层遍历结果输出。伪代码:

//定义队列
Queue q;
//结果集
List res;
//root 入队
q.add(root);
//给定一个标识,标记第一层遍历的结尾
q.add(null);
while(q不为空){
	//出队
	temp=q.peek();
	//不是标识的话,入队root.left、root.right
	if(temp不为null){
		res.add(temp.val);
		if(temp.left不为null){
			q.add(temp.left);
		}
		if(temp.right不为null){
			q.add(temp.right);
		}
	}
	//否则,该层遍历完毕
	else {
		q.add(null);
	}
}

在这里插入图片描述
复杂度分析

  • 时间复杂度:O(n),其中n为二叉树的节点数,每个节点访问一次
  • 空间复杂度:O(n),队列的空间为二叉树的一层的节点数,最坏情况二叉树的一层为O(n)级

2.2 递归

根据二叉树的定义,不难看出,每个节点都有类似的性质。当遍历发生时,对于其左右子树同样适用相同的规则,非常适合递归。可以借鉴之前对于二叉树的前中后序遍历,既然可以用递归解决,那层次遍历也未尝不可。同样可以运用标记的思想,对于同一层,可以标记为相同的深度来进行遍历。伪代码:

void traverse(TreeNode root, int depth);

//计入子节点,则深度depth+1
//递归左右时深度记得加1
traverse(root.left, depth + 1); 
traverse(root.right, depth + 1);

//每个节点值放入对应的二维数组相应行
res[depth - 1].push_back(root->val);

复杂度分析

  • 时间复杂度:O(n),n为节点数量,DFS对每个节点访问一次,因此递归调用n次,每次调用执行常数次操作,时间复杂度O(n)。
  • 空间复杂度:O(n),空间复杂度在于递归调用深度和每次递归调用辅助空间,辅助空间为常数级,与节点深度相关,当节点深度为n时最大,为O(n)。

3.代码

import java.util.*;

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

public class Solution {
    /**
     * 利用队列的性质
     * @param root TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        if (null == root) {
            return new ArrayList<>();
        }
        //结果
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        //每层临时结果
        ArrayList<Integer> temp = new ArrayList<>();
        TreeNode node;
        //队列
        LinkedList<TreeNode> list = new LinkedList<TreeNode>();
        list.add(root);
        //给定个 层标识
        list.add(null);
        //遍历队列
        while (!list.isEmpty()) {
            node = list.removeFirst();
            if (null != node) {
                temp.add(node.val);
                if (null != node.left) {
                    list.add(node.left);
                }
                if (null != node.right) {
                    list.add(node.right);
                }
            }
            //为null节点,说明这一层已经遍历完成
            else {
                //这里一定要判断下,如果为空,表明二叉树已经遍历完成了
                if (!temp.isEmpty()) {
                    res.add(temp);
                    temp = new ArrayList<>();
                    list.add(null);
                }

            }
        }
        return res;
    }
	
	//记录输出
    ArrayList<ArrayList<Integer> > res = new ArrayList();
    
	//递归
	public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        if(root == null)
            //如果是空,则直接返回
            return res;
        //递归层次遍历
        traverse(root, 0);
        return res;
    }
    
    //临时结果集
    ArrayList<Integer> row;
    
	void traverse(TreeNode root, int depth) {
        if(root != null){
            //新的一层: 对于二维res来说,将根视为第0层,树的深度正好等于一维res的个数
            if(res.size() == depth){ 
                row = new ArrayList();
                res.add(row);
            //读取该层的一维数组,将元素加入末尾
            }else{
                row = res.get(depth); 
            }
            row.add(root.val);
        }
        else
            return;
        //递归左右时深度记得加1
        traverse(root.left, depth + 1);
        traverse(root.right, depth + 1);
    }
}

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

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

相关文章

Centos7配置静态ip地址

目录 查找配置网络的文件 配置静态ip VMware查找网关ip Windows Mac 查找配置网络的文件 先输入以下命令查看下ip是通过哪个文件来配置的 ip addr 修改网络配置文件&#xff08;注意看我上面查到的是ens32, 所以在ifcfg-后面拼的是这个&#xff09; vi /etc/sysco…

VM——下载 centos

进入centos官网 这里显示了我所在地区可用的ISO镜像&#xff0c;这里我选阿里的镜像库 然后选择centos的版本&#xff0c; 【DVD】标准版本 【Everything】集成所有软件版本 【LiveGNOME】GNOME桌面版本 【LiveKDE】KDE桌面版本 【Minimal】最小安装版本 【NetInstall】网…

Qt Quick - TabBar

Qt Quick - TabBar使用总结 一、概述二、调整选项卡三、Flickable标签三、定制化 一、概述 TabBar其实就是选项卡&#xff0c;TabBar是由TabButton控件填充&#xff0c;TabBar可以与任何提供currentIndex属性的布局或容器控件一起使用&#xff0c;如StackLayout或SwipeView。T…

扬帆优配|鼎智科技大涨22%登上龙虎榜 新股“赚钱效应”再现

上市第三天&#xff0c;鼎智科技(873593)因大涨22%登上“龙虎榜”&#xff0c;北交所发表的数据显示&#xff0c;组织现身买入榜&#xff0c;同时卖出榜也呈现了组织座位。 鼎智科技上市后接连上涨&#xff0c;使得北交所新股呈现久违的“赚钱效应”。从近期北交所新股的发行结…

从高考开始跌跌撞撞到目前的研究生拟录取

文章目录 前言一、高考的失利二、本科生活三、研究生初试的力不从心四、研究生复试的措手不及后话 前言 其实我一直都很想写写关于我的学习生涯之类的记录&#xff0c;但是不知道该以何种心态来书写… 看到学信网的拟录取通知当时其实是有点麻木的&#xff0c;感觉有很多话想说…

Pytorch深度强化学习:Gym安装与环境搭建教程(附基本指令表)

目录 1 Gym介绍2 Gym安装3 基本指令3.1 make()3.2 reset()3.3 step()3.4 close() 4 常见问题参考资料 1 Gym介绍 强化学习是在潜在的不确定复杂环境中&#xff0c;训练一个最优决策指导一系列行动实现目标最优化的机器学习方法。自从AlphaGo的横空出世之后&#xff0c;确定了强…

从promise到await

在之前的这篇文章中&#xff0c;已经讲完了从异步操作到promise的诞生&#xff0c;但是promise也仅仅是做到了异步操作和结果的分离&#xff0c;当我们有多个异步操作&#xff0c;且结果前后有依赖的时候&#xff0c;不可避免的&#xff0c;就会出现一系列的.then方法。还是不大…

【JS每N日一练】 将CSDN文章自动生成Markdown列表

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 分析及编码页面分析枚举列表处理li&#xff0c;获取Markdown完成功能拼装 2️⃣ 完整代码及运行结果完整代码运行结果 &#x1f6ec; 总结 &#x1f6eb; 问题 描述 作为程序员必备素质-懒&#xff0c;今天又给自己了一个造了个需…

QGIS--开发OpenSCENARIO动态场景(一)--Ubuntu20.04 安装QGIS

qgis的git&#xff1a; GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址&#xff1a;https://plugins.qgis.org/plugins/ 1.Prerequisi…

java IO流_2

目录 字节缓冲流 序列化 使用对象流实现序列化 标准输入输出流 转换流 打印流 PrintStream PrintWriter properties读写文件 字节缓冲流 字节流 import java.io.FileInputStream; import java.io.FileOutputStream;public class FileCopy {public static void main(Str…

年薪30W+,待遇翻倍,我的经历值得每个测试人借鉴

从自考大专到出走公司&#xff0c;从半年无业露宿深圳北站&#xff0c;从8k…到11.5k…再到20k&#xff0c;我的经历值得每个测试人借鉴 或许学历并没有那么重要 12年高考之后&#xff0c;在朋友的介绍下&#xff08;骗了过去&#xff09;&#xff0c;没有好好的读大学&#x…

java mysql高校后勤管理系统的设计与开发 宿舍公寓管理

1&#xff0e;用户管理子系统&#xff1a;采用通过用户密码的登录机制&#xff0c;管理员登录后可以修改个人信息&#xff08;用户名、密码、姓名、联系方式&#xff09;&#xff0c;具有楼的属性&#xff0c;只能对所管辖宿舍楼进行查询、修改等操作。 2.宿舍信息管理子系统&a…

上海出台新政数字经济、人工智能利好

利好一、上海印发 《上海市推进算力资源统一调度指导意见》的通知 数字经济、人工智能的利好不断。 19日&#xff0c;上海市经济信息化委印发《上海市推进算力资源统一调度指导意见》的通知。 其中提到&#xff1a; 到2023年底&#xff0c;依托本市人工智能公共算力服务平台…

【U8+】win10/11系统注册用友U8硬加密

【问题需求】 由于用友U813.0及之前版本都是硬加密&#xff0c; 并且注册的时候严格要求使用IE浏览器。 但是随着系统的升级&#xff0c;绝大多数的都开始使用win10/11系统。 并且IE浏览器已经不支持win10/11系统&#xff0c; 取而代之的是Edge浏览器。 【经验分享】 以下分享…

扬帆优配|放量跌停和缩量跌停的区别?哪个更好?

投资者在买卖股票的过程中股票跌停的话&#xff0c;一般会呈现两种状况&#xff1a;一种是放量跌停&#xff0c;一种是缩量跌停。很多投资者不明白两者到底有什么差异&#xff0c;那么放量跌停和缩量跌停的差异是什么&#xff1f;哪个更好&#xff1f;下面就由扬帆优配有为我们…

使用node版本管理器gnvm

目录 一、官网 二、下载 三、查看本机node安装地址 四、将gnvm放到node安装目录 五、安装其他版本node&#xff08;以管理员身份打开CMD&#xff09; 六、使用指定版本&#xff08;以管理员身份打开CMD&#xff09; 七、查看当前版本&#xff08;以管理员身份打开CMD&…

Spring依赖注入的三种方式使用及优缺点

初学Spring的时候,我们从Spring容器中获取Bean对象都是通过bean标签先将Bean对象注册到Spring容器中&#xff0c;然后通过上下文对象congtext的getBean方法进行获取&#xff0c;显然这种方法较为麻烦&#xff0c;所以有了更简单的存方法&#xff1a;五大类注解&#xff1b;取方…

应急响应 - Windows用户分析,Windows隐藏账号分析,Windows克隆账号分析

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Windows账户分析 一、普通用户二、隐藏用户1、lusrmgr.msc2、注册表 三、克隆账号 攻击者…

mysql varchar类型字段为数字时,不带引号查询时查询结果与事实不符

背景 今天出现了一个bug&#xff0c;在数据库中我们将订单表中的order_no从之前的bigint(20)改成varchar(20)后&#xff0c;原有的代码逻辑在进行时查询时&#xff0c;之前是以Long类型传参查询的。 select * from order_main where order_no16541913435669023debug时的时候发现…

2023年湖北安全员ABC报名条件和报名资料是什么?

一、湖北安全员ABC报名条件要求&#xff1a; 1.安全员A证针对的是企业主要负责人&#xff0c;包括法定代表人、总经理&#xff08;总裁&#xff09;、分管安全生产的副总经理&#xff08;副总裁&#xff09;、分管生产经营的副总经理&#xff08;副总裁&#xff09;、技术负责…