LeetCode题练习与总结:二叉树的右视图--199

news2024/11/15 1:43:44

一、题目描述

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100 

二、解题思路

  1. 使用广度优先搜索(BFS)遍历二叉树,从上到下、从左到右进行遍历。
  2. 在每一层遍历中,取最右侧的节点值,将其添加到结果列表中。
  3. 返回结果列表。

三、具体代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        // 结果列表
        List<Integer> res = new ArrayList<>();
        // 如果根节点为空,直接返回空列表
        if (root == null) {
            return res;
        }
        // 使用队列实现广度优先搜索
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            // 每一层的节点数量
            int size = queue.size();
            // 遍历当前层的所有节点
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                // 如果是当前层的最后一个节点,将其值添加到结果列表
                if (i == size - 1) {
                    res.add(node.val);
                }
                // 将左子节点加入队列
                if (node.left != null) {
                    queue.offer(node.left);
                }
                // 将右子节点加入队列
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
        return res;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 广度优先搜索(BFS)会遍历二叉树中的每个节点一次。
  • 对于每个节点,将其添加到队列和从队列中移除的操作是常数时间的,即 O(1)。
  • 在每一层,我们需要遍历所有节点,所以对于每个节点,我们最多会执行两次 O(1) 的操作(添加其左右子节点到队列)。
  • 假设二叉树有 n 个节点,则总的时间复杂度为 O(n),因为每个节点都只被访问一次。

因此,时间复杂度为 O(n),其中 n 是二叉树中的节点数量。

2. 空间复杂度
  • 队列中最多会存储二叉树的一层节点,在最坏的情况下,这一层可能有 n/2 个节点(完全二叉树的最底层)。
  • 结果列表 res 最多会存储二叉树的高度 h 个节点,其中 h 是二叉树的高度。
  • 在最坏的情况下,二叉树可能退化成一个链表,此时队列和结果列表的空间复杂度都是 O(n)。

因此,空间复杂度为 O(n),其中 n 是二叉树中的节点数量。

五、总结知识点

  • 类定义

    • class Solution 定义了一个名为 Solution 的类。
  • 成员方法

    • public List<Integer> rightSideView(TreeNode root) 定义了一个公共方法,返回类型为 List<Integer>,接收一个 TreeNode 类型的参数。
  • 数据结构

    • List<Integer>:一个泛型接口,用于存储整数列表。
    • Queue<TreeNode>:一个泛型接口,用于实现队列数据结构,这里用于广度优先搜索。
    • ArrayList:实现了 List 接口的可调整大小的数组列表。
    • LinkedList:实现了 List 接口和 Queue 接口的链表。
  • 条件语句

    • if (root == null):检查根节点是否为空。
  • 循环结构

    • while (!queue.isEmpty()):一个 while 循环,用于在队列不为空时持续执行。
  • 队列操作

    • queue.offer(root):将根节点添加到队列的末尾。
    • queue.poll():从队列的头部移除并返回元素。
    • queue.size():返回队列中的元素数量。
  • 逻辑控制

    • for (int i = 0; i < size; i++):一个 for 循环,用于遍历当前层的所有节点。
  • 列表操作

    • res.add(node.val):将元素添加到列表的末尾。
  • 递归结构

    • 虽然代码中没有直接使用递归,但是 TreeNode 结构是递归定义的,每个 TreeNode 都可能有两个子节点。
  • 节点访问

    • node.left 和 node.right:分别访问二叉树节点的左子节点和右子节点。
  • 二叉树遍历

    • 使用广度优先搜索(BFS)来遍历二叉树,通过队列实现层序遍历。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

判别回形针的方向(clip.hdev)

1.1应用示例思路 (1) 利用Blob分析(一般步骤&#xff1a;图像阈值分割、获取连通区域、计算Blob的相关几何特征)&#xff0c;获取目标区域。 (2) 求目标区域的中心坐标和方向。 1.2应用实例代码 * clip.hdev: Orientation of clips*是否必须在活动的图形窗口中显示图标对象…

“论面向服务架构设计及其应用”写作框架,软考高级,系统架构设计师

论文真题 面向服务架构&#xff08;Service-Oriented Architecture, SOA&#xff09; 是一种应用框架&#xff0c;将日常的业务应用划分为单独的业务功能服务和流程&#xff0c;通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构&#xff0c;用…

GPT-5 惊涛来袭:铸就智能新传奇

目录 引言&#xff1a; 正文&#xff1a; 方向一&#xff1a;人工智能发展现状 方向二&#xff1a;GPT-5技术突破预测 方向三&#xff1a;智能系统人类协作 方向四&#xff1a;迎接AI技术变革策略 结束语&#xff1a; 引言&#xff1a; 在科技浩渺浪潮澎湃翻涌的时代&…

ThinkPHP5 5.0.23 远程代码执行漏洞

目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…

聚星文社,绘唐科技AI工具

聚星文社是一个文学创作社区&#xff0c;为广大创作者提供了一个交流和展示作品的平台。绘唐科技是一家AI技术公司&#xff0c;专注于开发人工智能工具和解决方案。绘唐科技与聚星文社合作&#xff0c;为聚星文社的创作者提供了一款AI工具&#xff0c;帮助创作者提升创作效率和…

ES+FileBeat+Kibana日志采集搭建体验

1.环境准备 需要linux操作系统&#xff0c;并安装了docker环境 此处使用虚拟机演示。&#xff08;虚拟机和docker看参考我之前写的文章&#xff09; VirtualBox安装Oracle Linux 7.9全流程-CSDN博客 VirtualBox上的Oracle Linux虚拟机安装Docker全流程-CSDN博客 简单演示搭建ES…

高可用集群keepalived 详细讲解

一&#xff1a;高可用集群keepalived LB&#xff1a;Load Balance 负载均衡 负载均衡&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器…

git详细命令

git常用命令&#xff0c;待 1. 前言2. Git安装3. 公钥3.1 生成公钥3.2 配置SSH 密钥 4. 配置用户名和邮箱5. git常用命令5.1 创建仓库命令5.1.1 git init命令5.1.2 git clone[url] 命令 5.2 add 增加 / 删除文件 &#xff08;跟踪文件&#xff09;5.3 代码提交5.4 分支5.5 标签…

性能优化理论篇 | Cache VS Buffer,傻傻分不清 ?

性能优化系列目录&#xff1a; 性能优化理论篇 | 彻底弄懂系统平均负载 性能优化理论篇 | swap area是个什么东西 从free命令开始 free 命令是一个在类 Unix 操作系统中用于显示内存使用情况的工具。它的输出包含了系统内存的不同方面&#xff0c;如总内存、已用内存、空闲内存…

不同路径 II[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 一个机器人位于一个m x n网格的左上角 &#xff08;起始点在下图中标记为Start&#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为Finish&#xff09;。 现在考虑网格中有…

@[TOC](letcode 分类练习 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度)

letcode 分类练习 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 226.翻转二叉树101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度 226.翻转二叉树 利用自底向上的遍历交换左子树和右子树 class Solution { public:TreeNode* invertTr…

后端Web之数据库(以MySQL为例)

目录 1.概述 2.MySQL 3.DDL 4.DML 5.DQL 1.概述 对于我们自己写的一些小功能&#xff0c;数据一般存储在文件中&#xff0c;比如XML文件。而在实际项目中&#xff0c;数据都是存放在数据库中的。数据库&#xff08;DataBase &#xff09;是一个存储数据的集合&#xff0c…

双剑合璧,网络无敌!Windows Server 2012 R2双网卡绑定实战教程

文章目录 双剑合璧&#xff0c;网络无敌&#xff01;Windows Server 2012 R2双网卡绑定实战教程1 背景信息2 配置步骤2.1 登录服务器2.2 分别清除两块网卡的配置2.3 进入“本地服务器”界面2.4 进入“NIC组合”界面2.5 创建网卡绑定组2.6 设置新建组参数2.7 查看已创建的网卡组…

【计算机硬件蓝光光驱】

蓝光光驱&#xff08;Blu-ray Disc Drive&#xff09;是一种光盘驱动器&#xff0c;用于读取和写入蓝光光盘。蓝光光盘是一种高容量、高清晰度的光存储介质&#xff0c;用于存储视频、音频、数据等多种媒体内容。蓝光光驱的名称“蓝光”来源于其使用的蓝色激光光束&#xff0c;…

Windows 安装 及解决 tvm 无法打开 源 文件 “dmlc/logging.h“

如果你在编译 TVM 时遇到 dmlc/logging.h 文件缺失的问题&#xff0c;很可能是因为在克隆 TVM 仓库时没有包含其子模块&#xff0c;而这些子模块&#xff08;如 dmlc-core&#xff09;是通过 Git 管理的。解决步骤 安装 Git&#xff1a; 如果你还没有安装 Git&#xff0c;需要先…

ES6学习笔记(九)——class(类)

1. 封装 传统面向对象的编程序语言都是【类】的概念&#xff0c;对象都是由类创建出来&#xff0c;然而早期 JavaScript 中是没有类的&#xff0c;面向对象大多都是基于构造函数和原型实现的&#xff0c;但是 ECMAScript 6 规范开始增加了【类】相关的语法&#xff0c;使得 Ja…

虚幻5|AI视力系统,听力系统,预测系统(1)视力系统

继宠物伴随系统初步篇后续 虚幻5|AI巡逻宠物伴随及定点巡逻—初步篇-CSDN博客 一&#xff0c;听力系统 1.打开宠物ai的角色蓝图 2.选中ai感知组件 右侧细节&#xff0c;找到ai感知&#xff0c;添加感知配置&#xff0c;我们需要的是ai视力配置 3.选中左侧创建的ai感知组件&…

CLRerNet推理详解及部署实现(上)

目录 前言1. 概述2. 环境配置3. Demo测试4. ONNX导出初探5. ONNX导出优化6. ONNX导出总结结语下载链接参考 前言 继续我们的车道线检测任务&#xff0c;之前我们分享了基于 anchor 的 LaneATT 模型以及 CVPR2022 的 SOTA 方案 CLRNet&#xff0c;这里我们分享 WACV2024 中的一个…

如何在Linux系统上使用ONLYOFFICE文档编辑PDF文件

​对Linux用户来说&#xff0c;得益于各类免费PDF编辑器&#xff0c;编辑PDF文件从来都不是无解难题。 如果您需要为PDF文件添加注释、留下批注、编辑已有文本或添加新文本框、插入图片或形状、删除某些页面或永久删除页面&#xff0c;您始终可以找到合适的应用&#xff0c;轻…

有关JavaScript的函数定义和函数的两种声明方式

1.函数 函数是一段可重复执行的代码块&#xff0c;它可以接收参数&#xff0c;并返回结果。在JavaScript中&#xff0c;函数用于封装可重用的代码&#xff0c;提高代码的可读性和可维护性。 1.1 函数的定义 函数的定义包括以下几个部分&#xff1a; 函数名称&#xff1a;用…