二叉树题目:二叉树的右视图

news2024/12/26 4:07:13

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉树的右视图

出处:199. 二叉树的右视图

难度

4 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root,想象自己站在其右侧,按照从顶部到底部的顺序,返回从右侧能看到的结点值。

示例

示例 1:

示例 1

输入: root   =   [1,2,3,null,5,null,4] \texttt{root = [1,2,3,null,5,null,4]} root = [1,2,3,null,5,null,4]
输出: [1,3,4] \texttt{[1,3,4]} [1,3,4]

示例 2:

输入: root   =   [1,null,3] \texttt{root = [1,null,3]} root = [1,null,3]
输出: [[1,3]] \texttt{[[1,3]]} [[1,3]]

示例 3:

输入: root   =   [] \texttt{root = []} root = []
输出: [] \texttt{[]} []

数据范围

  • 树中结点数目在范围 [0,   100] \texttt{[0, 100]} [0, 100]
  • -100 ≤ Node.val ≤ 100 \texttt{-100} \le \texttt{Node.val} \le \texttt{100} -100Node.val100

解法一

思路和算法

由于二叉树的右视图包含的结点值为从顶部到底部的每一层的最右边的结点值,因此可以使用层序遍历实现。

层序遍历的方法为从根结点开始依次遍历每一层的结点,同一层的结点的遍历顺序为从左到右,因此在遍历每一层时,最右边的结点一定是最后被访问的。只要得到每一层最后被访问的结点,即可得到二叉树的右视图。

为了得到每一层最后被访问的结点,在层序遍历的过程中需要区分不同结点所在的层,确保每一轮访问的结点为同一层的全部结点。

使用队列存储待访问的结点,初始时将根结点入队列。每一轮访问结点之前首先得到队列内的元素个数,然后访问这些结点,并将这些结点的非空子结点入队列。该做法可以确保每一轮访问的结点为同一层的全部结点。

将每一层最后被访问的结点添加到右视图序列中,遍历结束之后即可得到二叉树的右视图。

代码

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> view = new ArrayList<Integer>();
        if (root == null) {
            return view;
        }
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        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) {
                    view.add(node.val);
                }
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
        return view;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

解法二

思路和算法

也可以使用深度优先搜索得到二叉树的右视图。具体做法是使用前序遍历,依次访问二叉树的根结点、左子树和右子树,由于前序遍历满足同一层结点被访问的顺序为从左到右,因此同一层结点中最后被访问的结点即为该层最右边的结点。

遍历过程中维护二叉树的右视图。对于每个结点,得到其所在层,然后将右视图序列中该层的结点值设为当前结点值。由于在每一层中,最右边的结点都是最后被访问,因此遍历结束时,右视图序列中的每个结点值都是每一层最右边的结点值。

代码

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> view = new ArrayList<Integer>();
        Deque<TreeNode> nodeStack = new ArrayDeque<TreeNode>();
        Deque<Integer> depthStack = new ArrayDeque<Integer>();
        TreeNode node = root;
        int depth = 0;
        while (!nodeStack.isEmpty() || node != null) {
            while (node != null) {
                if (depth < view.size()) {
                    view.set(depth, node.val);
                } else {
                    view.add(node.val);
                }
                nodeStack.push(node);
                depthStack.push(depth);
                node = node.left;
                depth++;
            }
            node = nodeStack.pop().right;
            depth = depthStack.pop() + 1;
        }
        return view;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

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

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

相关文章

Git Bash 和 Git GUI中文汉化

目录 为什么要中文汉化&#xff1f;Git Bash的汉化Git GUI的汉化 为什么要中文汉化&#xff1f; 看到中文大概能猜出是什么意思&#xff0c;便于使用&#xff0c;特别是Git GUI&#xff0c;中文版的菜单很容易理解是要做什么&#xff0c;如下图&#xff1a; Git Bash的汉化 …

纽扣电池PSE认证检测标准是什么?纽扣电池PSE认证办理机构

中国制造商要申请PSE认证&#xff0c;首先要确定其申请的产品是否在中国质量认证中心(CQC)获得授权受理的认证CE范围内。由于目前CQC获得的授权是基于技术基准2&#xff0c;制造商须选择技术基准2申请PSE认证。确认后制造商可向CQC提出书面申请&#xff0c;并将样品与技术资料提…

Spring源码分析(九)Bean实例化的后置处理

目录 1.1 后置处理1.1.1 调用父类方法1.1.2 获取元数据1.1.3 注解元信息检查1.1.4 Member、InjectedElement、InjectionMetadata 官网&#xff1a;Home参考书籍&#xff1a;Spring源码深度解析-郝佳编著-微信读书 上一节我们详细的解释了Bean的创建过程&#xff0c;工厂&#…

OpenCV(二):认识Mat容器

目录 1.什么是Mat类 2.Mat类能存储的数据 整数类型&#xff08;有符号和无符号&#xff09;&#xff1a; 浮点数类型&#xff1a; 布尔类型&#xff1a; 3.Mat类的创建 1.利用矩阵宽、高和类型参数创建Mat类 2.利用矩陈Size(结构和数据类型参数创建Mat类 3.利用已有Mat…

三十七个常见Vue面试题,背就完事了四

二十八、Vue.use是干什么的&#xff1f;Vue.use是用来使用插件的。我们可以在插件中扩展全局组件、指令、原型方法等。 会调用install方法将Vue的构建函数默认传入&#xff0c;在插件中可以使用vue&#xff0c;无需依赖vue库 二十九、组件写name有啥好处&#xff1f; 增加name…

恒运资本:什么叫融资通俗的讲是什么意思?

融资浅显的讲是什么意思&#xff1f; 近年来&#xff0c;伴随着互联网金融的鼓起&#xff0c;融资这个词越来越为人们所熟知。但是&#xff0c;关于融资这个词的意思&#xff0c;很多人也许只是有一个含糊的概念&#xff0c;无法做到准确而深入的了解。本文将从多个角度剖析&a…

VB:百元买百鸡问题

VB&#xff1a;百元买百鸡问题 Private Sub Command1_Click()ClsRem 百元买百鸡问题Print "公鸡", "母鸡", "小鸡"For x 0 To 20For y 0 To 33z 100 - x - yIf z Mod 3 0 ThenIf 5 * x 3 * y z / 3 100 ThenPrint x, y, zEnd IfEnd IfNe…

亚运会即将召开,数字孪生体育场能够发挥什么作用?

亚运会&#xff0c;作为亚洲地区最重要的综合性运动盛会之一&#xff0c;将吸引数以千计的运动员、教练员和观众汇聚一堂&#xff0c;共同见证运动的魅力。在如此大规模的体育盛会中&#xff0c;数字孪生技术能够为运动场馆的规划、运营和观众带来前所未有的体验。 数字孪生技术…

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序 一、简介1. 内置 jtag 介绍2. OpenOCD3. 准备工作 二、操作步骤1. 接线2. 在VSCode设置端口等信息3. 测试编译烧录 三、调试程序 一、简介 1. 内置 jtag 介绍 在ESP32中&#xff0c;内置了一个用于JTAG调试的特殊程序&#xff…

【实验八】555定时器的应用

【实验内容】 【实验报告】 【实验截图】 1 2 3 【得分】

(c++)类和对象 上篇

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步…

C++ for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构。 语法 C 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); }下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任…

模糊测试面面观 | 模糊测试是如何发现异常情况的?

协议模糊测试是一种用于评估通信协议、文件格式和API实现系统安全性和稳定性的关键技术。在模糊测试过程中&#xff0c;监视器扮演着关键角色&#xff0c;它们能够捕获异常情况、错误响应、资源利用等&#xff0c;为测试人员提供有价值的信息&#xff0c;有助于发现潜在漏洞和问…

STM32-串口通信(串口的接收和发送)

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结&#xff0c;各…

LeetCode——栈的压入、弹出序列

这里我用下面的例子子来讲解一下模拟栈的实现。 例子1&#xff1a;pushed [1,2,3,4,5] popped [4,5,3,2,1] 思路&#xff1a;第一步&#xff1a;我们先创建一个栈&#xff0c;然后将pushed的数据压进去 第二步&#xff1a;判断&#xff01; 当压入栈的数据和popped第一个数据…

【实验六】组合逻辑电路的设计

【实验内容】 【实验报告】

向openssl中添加一个最简单的算法

文章目录 一、尝试在sha.c中添加新的函数二、添加自定义算法2.1 添加对应文件2.2 相关配置2.3 编译运行 一、尝试在sha.c中添加新的函数 在尝试添加新算法前&#xff0c;我先尝试在原有的旧算法中添加一个新函数&#xff0c;看是否能被编译并生成对应的动态链接库。 关于open…

unity 跨屏显示

1.代码 /*Type:设置分辨率*/ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Runtime.InteropServices;public class ScreenManager : MonoBehaviour {[HideInInspector]//导入设置窗口函数 [DllImport("…

nginx压缩ttf文件 mine.types的作用

最近在运维过程中&#xff0c;前端提到发现在linux上下载某ttl文件&#xff08;字体文件&#xff09;太大&#xff0c;传输过程比较慢&#xff0c;于是就想着使用nginx的gzip进行压缩&#xff0c;经过不断尝试&#xff0c;终于发现在nginx的配置目录/etc/nginx/mine.types 文件…

Windows中安装nvm进行Node版本控制与详细使用教程

1.nvm介绍 nvm英文全程也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和npm都是node.js版本管理工具&#xff0c;但是为了解决node各种不同之间版本存在不兼容的问题&#xff0c;因此可以通过nvm安装和切换不同版本的node。 2.nvm下载 可在点此…