【面试经典 150 | 二叉树层序遍历】二叉树的右视图

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:层序遍历
    • 方法二:深度优先搜索
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【二叉树】【层序遍历】【深搜】【广搜】


题目来源

199. 二叉树的右视图


解题思路

方法一:层序遍历

思路

使用层序遍历的方法,返回二叉树每一层的最后一个节点。

如果对于层序遍历知识不熟悉,可以参考 广度优先搜索(1)之树的层序遍历 和 【二叉树的四种遍历——前序、中序、后续和层序遍历】。

算法

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> res;if (root == NULL)return res;queue<TreeNode*> q;q.push(root);while (!q.empty()) {int size = q.size();TreeNode *node = nullptr;while(size--)  {node = q.front();q.pop();if (node->left) q.push(node->left);if (node->right) q.push(node->right);}res.emplace_back(node->val);}return res;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 是二叉树中的节点数,每个节点最多入队出队各一次。

空间复杂度: O ( n ) O(n) O(n)

方法二:深度优先搜索

思路

我们对树进行深度优先搜索,在搜索的过程中需要总是先访问右子树。那么对于每一层来说,我们在这层看到的第一个节点及就是一定是最右边的节点。

如何保证总是先访问右子树?利用栈的后进先出的特点,依次将当前节点的左、右节点压入栈中,那么栈中弹出的节点顺序就是先右再左子节点了。

如何实现 我们在这层看到的第一个节点及就是一定是最右边的节点 ?维护一个表示层深的局部变量,以此作为哈希表的键,二叉树当前层深所在层的最后节点值作为哈希表的值。

只有当前层深未曾出现在哈希表时,才更新哈希表,这样加上利用栈存放节点,便可以保证 “我们在这层看到的第一个节点及就是一定是最右边的节点”。

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> mostRNodeDepth2Val;int maxDepth = -1;stack<TreeNode*> nodeStk;   // 节点栈stack<int> depthStk;        // 与节点对应的深度栈nodeStk.push(root);depthStk.push(0);while (!nodeStk.empty()) {TreeNode* node = nodeStk.top(); nodeStk.pop();int depth = depthStk.top(); depthStk.pop();if (node != nullptr) {maxDepth = max(maxDepth, depth);// 不存在对应深度的节点,我们才插入if (mostRNodeDepth2Val.find(depth) == mostRNodeDepth2Val.end()) {mostRNodeDepth2Val[depth] = node->val;}nodeStk.push(node->left);nodeStk.push(node->right);depthStk.push(depth + 1);depthStk.push(depth + 1);}}vector<int> rightView;for (int depth = 0; depth <= maxDepth; ++depth) {rightView.push_back(mostRNodeDepth2Val[depth]);}return rightView;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n),深搜最多访问每个节点一次。

空间复杂度: O ( n ) O(n) O(n),最坏情况下,栈内包含接近树高度的节点数量,占用 O ( n ) O(n) O(n) 空间。


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

Java静态绑定和动态绑定

java动态绑定和静态绑定 在Java中&#xff0c;绑定是指将一个方法调用与方法体连接起来的过程。Java支持两种类型的绑定&#xff1a;静态绑定&#xff08;也称为早期绑定&#xff09;和动态绑定&#xff08;也称为晚期绑定或虚拟调用&#xff09;。区分这两种绑定方式主要取决…

串口通信如何控制步进电机转动?

在自动化控制系统中&#xff0c;步进电机的控制是一项重要的技术任务。通过串口通信控制步进电机转动&#xff0c;可以实现远程控制和自动化操作&#xff0c;提高生产效率和降低人工成本。本文将详细介绍串口通信控制步进电机转动的关键步骤和技术要点。 首先&#xff0c;我们…

【Linux】进程和计划任务

目录 一、进程介绍 1.1 进程与线程的定义 1.1.1 进程(Process)** 1.1.2 线程(Thread)** 1.1.3 进程与线程的区别 1.2 进程的特征 1.3 进程状态 1.3.1 进程的基本状态 1.3.2 进程更多的状态 1.4 进程的优先级 1.5 进程间通信 1.6 进程的分类* 二、进程管理 2.1 查看…

使用Python操作SQLite

1、连接数据库 import sqlite3 conn sqlite3.connect(example.db)其中 example.db 是数据库文件名&#xff0c;如果不存在则会自动创建。connect() 方法还可以接收多个参数&#xff0c;用于设置连接属性&#xff0c;如 conn sqlite3.connect(example.db, isolation_levelNo…

【shell编程系统巡检项目】

目录 系统巡检指标信息代码 系统巡检 所谓系统巡检就是就是定时检查系统的各项指标&#xff0c;与监控互补。 指标信息 1.基本信息:主机名&#xff0c;ip地址&#xff0c;公网ip&#xff0c;系统发行版本&#xff0c;内核版本&#xff0c;cpu架构 hostname hostname -i curl…

SpringBoot项目创建及简单使用

目录 一.SpringBoot项目 1.1SpringBoot的介绍 1.2SpringBoot优点 二.SpringBoot项目的创建 三.注意点 一.SpringBoot项目 1.1SpringBoot的介绍 Spring是为了简化Java程序而开发的&#xff0c;那么SpringBoot则是为了简化Spring程序的。 Spring 框架&#xff1a; Spring…

【UKE!】2024.4.19

2024.4.19 【你知道的都是真相。只可惜那些并不是真相的全部。】 Friday 三月十一 谷雨 <BGM “谷雨–音阙诗听”> AC :Answer Coarse,粗劣的答案 ​ CE :Compile Easily,轻松通过 ​ PC :Perfect Compile 完美的编译 ​ WA :Wonderful Answer,好答案 ​ RE :Run Exce…

【InternLM 实战营第二期作业04】XTuner微调LLM:1.8B、多模态、Agent

基础作业 训练自己的小助手认知 1.环境安装 安装XTuner 源码 # 如果你是在 InternStudio 平台&#xff0c;则从本地 clone 一个已有 pytorch 的环境&#xff1a; # pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0studio-conda xtuner0.1.17 # 如果你是在其他平台&#x…

区块链的应用场景及优势

区块链技术具有广泛的应用场景和众多的优势。 金融服务&#xff1a;区块链技术可以改善金融服务的效率与安全性。通过使用分布式账本&#xff0c;可以实现更快捷的支付和结算系统&#xff0c;减少交易的中介环节和成本。区块链还可以提供去中心化的借贷、投资和众筹平台&#x…

SpringSecurity源码分析3--UserDetail部分

前言&#xff1a;本章提及的类都是与用户名、密码相关的类 UserDetailsService.class 用于加载用户信息 DaoAuthenticationProvider.class 将数据库的信息拿出来进行认证 AbstractUserDetailsAuthenticationProvider.class DaoAuthenticationProvider的父类&#xff0c;通过模…

【FreeRTOS】RTOS任务的同步与互斥:(二)信号量

【FreeRTOS】RTOS任务的同步与互斥&#xff1a;&#xff08;二&#xff09;信号量 信号量概念二值信号量二值信号量概念二值信号量相关API函数二值信号量的案例设计cubeMX配置软件程序设计 计数型信号量计数型信号量概念计数型信号量相关API函数二值信号量的案例设计cubeMX配置…

VUE 页码分页封装

VUE 页码封装组件 pagination/index.vue &#xff1a; <template><div class"pagination-contianer"><el-pagination background layout"prev, pager, next" :total"total" current-change"currentChange"> </e…

点赞列表查询列表

点赞列表查询列表 BlogController GetMapping("/likes/{id}") public Result queryBlogLikes(PathVariable("id") Long id) {return blogService.queryBlogLikes(id); }BlogService Override public Result queryBlogLikes(Long id) {String key BLOG_…

零基础小白如何自学网络安全(入门)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

从数据库中到处所有表的列、注释、类型、是否必填等信息

从数据库中到处所有中文表名、英文表名、所有列、注释、类型、长度、是否必填等信息&#xff0c;效果如下&#xff1a; 要实现上面的表格可以直接用SQL实现&#xff0c;实现SQL如下&#xff1a; #查询SQL select* FROMinformation_schema.COLUMNS as columns left join (sele…

【Jenkins PipeLine】Jenkins PipeLine 联动参数示例

目录 1. Pipeline script&#xff1a; 1.1.代码说明&#xff1a; 2. 实现效果&#xff1a; 3.联动说明&#xff1a; 4.Jenkins安装插件 1. Pipeline script&#xff1a; properties([parameters([[$class: "ChoiceParameter", choiceType: "PT_SINGLE_SELE…

在mini2440上编写linux应用程序、字符设备驱动程序的编写与编译

在mini2440上编写linux应用程序 结合前两篇的学习&#xff0c;一个linux操作系统已经在mini2440上运行起来了&#xff0c;结合交叉编译环境和nfs等工具&#xff0c;我们可以在mini2440上编写任何我们在linux系统编程中学到的应用程序。一个简要的多文件Makefile文件如下&#…

数组*巴巴拉拉

一&#xff0c;数组的定义以及创建方式 数组的作用&#xff1a;数组可以把一组数据的集合存放在单个变量下 创建数组有两种方式&#xff1a; 1.利用new创建数组 var arr new Array() 2.利用数组字面量创建数组(常用) var arr [] 注意点&#xff1a;数组里可以存放任…

C++笔记2:基类的静态变量子类能共享吗

C里&#xff0c;基类的静态变量子类能共享吗&#xff0c;为了验证这个问题这里写了一段代码进行测试&#xff1a; #include <iostream>class Base { public:static int staticVariable; };class Derived : public Base { };int Base::staticVariable 10;int main() {Ba…

2013–2022年福建漳江口互花米草分布无人机遥感数据集

文章目录 摘要数据集内容数据集命名方式数据引用与参考文献引用 摘要 本数据集利用无人机搭载可见光相机&#xff0c;获取福建漳江口湿地2013-2022年期间的航拍影像&#xff0c;通过影像拼接生成整个研究区的正射影像&#xff0c;制作十年尺度的遥感影像数据集及互花米草空间数…