图解LeetCode——199. 二叉树的右视图

news/2025/2/5 19:48:31/

一、题目

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

二、示例

2.1> 示例 1:

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

2.2> 示例 2:

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

2.3> 示例 3:

输入】 []
输出】 []

提示:

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

三、解题思路

根据题目描述,我们要构建一个给定二叉树的右侧视图。即,假设我们站在整棵二叉树的最右侧,向二叉树看去,能看到的每层一个节点分别是什么。那么也可以将其理解为,求解出每一层节点中最右侧的那个节点。那么针对这道题,我们可以采用两种常见的解题方式,即:层序遍历和深度优先遍历。那么层序遍历我们在之前的图解中介绍过了,核心解题思路就是两点:

思路1】创建Deque双向队列结构,来暂存节点。
思路2】每次遍历前,都要先获取Deque中节点的个数num,表示某层所存在的节点个数,然后只遍历num个节点。

然后获取每层最后一个节点存储到ArrayList中即可。此处就不赘述了。

那么除了层序遍历,我们也可以采用深度优先遍历方式进行题解。那么主要的解题思路也是有两点:

思路1】针对每次递归调用都传入level层号;
思路2】通过ArrayList的size()是否等于level,来判断某一层是否找到了右视图节点;如果等于,则表示之前没有找到右视图节点,然后调用add方法将当前节点保存到ArrayList即可。

以上就是本题的解题思路,为了便于大家理解,我们以二叉树为[1,2,3,null,4]为例,看一下具体的处理过程。请见下图所示;

四、代码实现

class Solution {List<Integer> result = new ArrayList();public List<Integer> rightSideView(TreeNode root) {dfs(root, 0);return result;}public void dfs(TreeNode node, Integer level) {if (node == null) return;if (result.size() == level) result.add(node.val);dfs(node.right, level + 1);dfs(node.left, level + 1);}
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」


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

相关文章

std::remove cannot convert ‘std::vector<std::__cxx11::basic_string<char> >:: 报错

最近遇到一个非常奇怪C++的问题: vector<string> tmp;tmp.erase(std::remove(tmp.begin(), tmp.end(), Routers[i].name_), tmp.end());在Windows下的VS中编译没有任何问题。 但是在Linux 下的 g++下面报错: 解决方法,包含头文件: #include <algorithm&g…

11.动态规划:树形DP问题、树上最大独立集【灵神基础精讲】

文章目录 树形DP问题一、树的直径&#xff08;二叉树>一般树&#xff09;[543. 二叉树的直径](https://leetcode.cn/problems/diameter-of-binary-tree/)[124. 二叉树中的最大路径和](https://leetcode.cn/problems/binary-tree-maximum-path-sum/)&#x1f3b1;(树的直径)[…

项目经理如何制定工作计划?做到这3点就够了

工作计划的重要性在于明确目标和实现具体步骤&#xff0c;协调大家一致行动&#xff0c;增强工作的主动性&#xff0c;减少工作的盲目性&#xff0c;让工作有条不紊地进行。同时&#xff0c;制定计划也可以对工作进度和质量有个保证和标准&#xff0c;对大家的工作有约束和督促…

《Java并发编程实战》课程笔记(九)

Semaphore&#xff1a;如何快速实现一个限流器&#xff1f; 信号量模型 信号量模型还是很简单的&#xff0c;可以简单概括为&#xff1a;一个计数器&#xff0c;一个等待队列&#xff0c;三个方法。 在信号量模型里&#xff0c;计数器和等待队列对外是透明的&#xff0c;所以…

不定参数va_arg的理解

简易 不定参数主要在printf中实现 主要理解在c/c里面&#xff0c;主要依靠<stdarg.h>里面va_list,va_start,va_end。 # include<stdio.h> #include <stdarg.h>void fun(int a,...) {va_list vsptr;va_start(vsptr,a);申明一个va_list类型对象vsptr&#xf…

d va爬黑板animate_部编版四年级语文上册第17课爬天都峰微课视频|MP3朗读|同步练习...

视频微课请拉到文末 视频微课请拉到文末 视频微课请拉到文末同步教材 点击图片,查看大图 ▼▼▼▼ 知识点 一、我会写组词 哩:li(还早哩、吃饭哩、上面哩) 级:j(石级、高级、初级) 链:lin(铁链、表

c语言va_list snprintf 的实现

首先列出我自己实际遇到的一个例子&#xff1a; 在串口向 PC 发送数据时为了实现可变参数的功能&#xff0c;这是工程中遇到的一段代码&#xff1a; int SerialDbgPrintf(uint8 type, char *fmt, ...) { if(type ATCMD) { int cnt; char string[MAX_PRINTF_STR_SIZE] {\0}; v…

va_start可变参数函数

void va_start(va_list ap, last); //变参起始地址 type va_arg(va_list ap, type); //下一个参数的地址 void va_end(va_list ap); void va_copy(va_list dest, va_list src); int vprintf(const char *format, va_list ap); //打印字符串 int vfprintf(FILE *stream, con…