【LeetCode75】第三十九题 二叉树的右视图

news/2025/1/11 10:15:35/

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一棵二叉树,让我们返回站在二叉树右边从上到下看到的节点。

那实际上就是要我们对二叉树进行层序遍历,然后把每层的最右边的一个节点拿出来。

所以问题实际上就是要我们对二叉树进行层序遍历,所以我们这边介绍两种层序遍历的方法,分别是DFS和BFS,也就是深度优先搜索和广度优先搜索。

首先是DFS深度优先搜索,我们先定义一个空的二维数组,是用来存放层序遍历的结果的。

我们对二叉树进行先序遍历,在递归遍历的同时携带一个代表深度的参数。

如果存放结果的二维数组的size也就是里面一维数组的数量小于等于深度,那就是我们第一次碰到这一层的节点,我们就往二维数组的后面塞一个一维的空数组。

然后再根据深度来将当前节点的值塞到二维数组的某个一维数组里。

先序遍历完毕,我们也就层序遍历完毕了。

这是DFS层序遍历的方法。我个人认为比较简单,不过层序遍历最经典的是BFS广度优先搜索,所以这边我们也将一下BFS怎么层序遍历。

我们拿一个队列,首先先把跟节点塞进队列里。

然后进入一个while循环,只要队列为空我们就退出循环,在循环体里我们先给存层序遍历的二维列表里塞一个空的一维列表,然后先记录一下队列的长度,然后再for循环队列长度次数,在for循环里再每次取出一个队列里的节点,把节点的值塞进二维数组的最后一个一维数组里面。

再对节点做判断,如果其左子树不为空,就把左子节点塞进队列里,如果其右子树不为空,把右子节点再塞进去。

这样就是每次我们只取二叉树的一层节点,并且存住每层的节点值后,还把每个节点的子节点塞进了队列,这样队列里就是下一层的节点了。

直到队列为空,那么就表示层序遍历完毕。

最终二维数组就是我们层序遍历的结果。

以上两种方法都可以对二叉树进行层序遍历。而本题中,我们需要把每层的最右边的节点返回出去,所以我们还需要取走二维数组里每个数组的最后一个元素。

代码:

DFS层序遍历

class Solution {
public:vector<vector<int>>cache;void find(TreeNode* root,int deep){if(root==nullptr) return;if(cache.size()<=deep) cache.push_back(vector<int>(0));cache[deep].push_back(root->val);find(root->left,deep+1);find(root->right,deep+1);}vector<int> rightSideView(TreeNode* root) {find(root,0);vector<int>res;for(auto&c:cache){res.push_back(*(c.end()-1));}return res;}
};

BFS层序遍历 

class Solution {
public:vector<int> rightSideView(TreeNode* root) {if(root==nullptr) return {};vector<vector<int>>cache;queue<TreeNode*>q;q.push(root);while(!q.empty()){cache.push_back(vector<int>(0));int l=q.size();for(int i=0;i<l;i++){TreeNode* node=q.front();q.pop();cache.back().push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}}vector<int>res;for(auto& c:cache){res.push_back(*(c.end()-1));}return res;}
};


http://www.ppmy.cn/news/1070581.html

相关文章

苹果备货量创新高,潜望镜头立大功,iPhone 15 Pro Max备受瞩目

根据郭明锤的简讯内容&#xff0c;关于苹果公司未来发布的iPhone 15系列&#xff0c;有一些令人振奋的消息。据预测&#xff0c;苹果公司计划于下个月发布iPhone 15系列&#xff0c;其中最高配置的机型iPhone 15 Pro Max备货量预计将占整个系列的35%至40%&#xff0c;这一比例超…

基于SpringBoot高校心理教育辅导设计与实现【附开题|万字文档(LW)和搭建文档】

主要功能 前台界面&#xff1a; ①首页、公告管理、查看更多等 ②心理健康学习、文章标题搜索、试卷列表、考试等 ③公告通知、留言反馈等 ④个人中心、考试记录、错题本等 后台登录&#xff1a; ①学生登录&#xff1a; 个人中心、修改密码、个人信息、辅导预约管理、考试管理…

WPF基础入门-Class5-WPF命令

WPF基础入门 Class5-WPF命令 1、xaml编写一个button&#xff0c;Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…

给oracle逻辑导出clob大字段、大数据量表提提速

文章目录 前言一、大表数据附&#xff1a;查询大表 二、解题思路1.导出排除大表的数据2.rowid切片导出大表数据Linux代码如下&#xff08;示例&#xff09;&#xff1a;Windows代码如下&#xff08;示例&#xff09;&#xff1a;手工执行代码如下&#xff08;示例&#xff09;&…

华为云云服务器评测|华为云云耀云服务器L实例使用教学

文章目录 教学小故事 教学 华为云云耀云服务器L实例是一款提供高效、可靠、安全的基础设施服务的云服务器。下面是使用教学&#xff1a; 登录华为云官网。 测评产品链接&#xff1a;https://www.huaweicloud.com/product/hecs-light.html 进入云耀云服务器管理控制台&#xf…

MTK6833_MT6833核心板_天玑700安卓5G核心板规格性能介绍

MTK6833安卓核心板采用台积电 7nm 制程的5G SoC&#xff0c;2*Cortex-A766*Cortex-A55架构&#xff0c;搭载Android12.0操作系统&#xff0c;主频最高达2.2GHz 。内置 5G 双载波聚合技术&#xff08;2CC&#xff09;及双 5G SIM 卡功能&#xff0c;实现优异的功耗表现及实时连网…

JVM知识点(一)

1、JVM基础概念 &#xff08;1&#xff09;JVM、JRE、JDK JRE&#xff1a;JVM基本类库组成的运行环境就是JRE。JVM自己是无法完成一次编译&#xff0c;处处运行的&#xff0c;需要有一个基本类库告诉JVM如何操作运行&#xff0c;如如何操作文件&#xff0c;连接网络等&#x…

爬虫逆向实战(二十四)--某鸟记录中心

一、数据接口分析 主页地址&#xff1a;某鸟记录中心 1、抓包 通过抓包可以发现数据接口是front/record/search/page 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;请求参数是加密的 请求头是否加密&#xff1f; 通过查…