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

news/2025/2/10 8:04:34/

题目描述

给定一棵二叉树的根节点,想象你站在它的右侧,返回你能看到的节点值(从上到下的顺序)。

示例:

输入:1/ \2   3\   \5   4
输出:[1,3,4]
解释:站在右侧时,只能看到每层最右边的节点

解题思路

这道题的核心是找到每一层最右边的节点。我们可以用递归的 DFS(深度优先搜索)来解决,但需要一点小技巧:

  1. 右子树优先:遍历时先访问右子树,再访问左子树。这样当第一次到达某一深度时,遇到的节点一定是该层最右侧的节点。

  2. 深度标记:维护一个全局变量 max_depth 记录当前已访问过的最大深度。只有当当前深度超过 max_depth 时,才记录节点值并更新最大深度。

举个栗子🌰:

  • 对于示例中的树,遍历顺序是 1 → 3 → 4 → 2 → 5

  • 当访问到节点 3(深度2)时,发现深度超过之前的 max_depth(初始为0),记录 3

  • 接着访问 4(深度3),记录 4

  • 最后访问 5(深度3),此时 max_depth 已经是3了,不再记录


代码实现

class Solution {
public:int max_depth = 0;  // 全局变量,记录当前最大深度void traversal(TreeNode *root, int depth, vector<int> &res) {if (!root) return;depth++;  // 进入节点时深度+1// 关键判断:首次到达新深度时记录节点值if (depth > max_depth) {max_depth = depth;     // 更新最大深度res.push_back(root->val); // 记录右侧节点}// 先递归右子树,再递归左子树(右子树优先)traversal(root->right, depth, res);traversal(root->left, depth, res);}vector<int> rightSideView(TreeNode* root) {if (!root) return {};  // 处理空树vector<int> res;traversal(root, 0, res);  // 初始深度为0return res;}
};

复杂度分析

  • 时间复杂度:O(n)
    每个节点恰好被访问一次,没有重复操作。

  • 空间复杂度:O(h)
    h 是树的高度,递归调用栈的深度最大为树高。最坏情况下(树退化为链表)空间复杂度为 O(n)。


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

相关文章

基于开源AI智能名片2+1链动模式S2B2C商城小程序的个人IP活动运营策略与影响力提升研究

摘要&#xff1a;本文围绕个人IP运营者借助活动运营提升影响力这一主题&#xff0c;深入探讨如何将开源AI智能名片21链动模式S2B2C商城小程序融入借势、造势、提升参与感及用户激励等活动运营环节。通过分析该创新模式与活动运营各要素的结合点&#xff0c;为个人IP运营者提供切…

开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1一、环境要求1.1 操作系统1.1.1 Ubuntu1.1.2 CentOS 1.2 数据库1.2.1 JumpServer 需要使用的数据库1.2.2 创建数据库 SQL 参考1.2.2.1 PostgreSQL1.2.2.2 MySQL…

换电脑了如何快速导出vscode里的插件

当你换电脑了&#xff0c;之前vscode里的插件又不想全部手动重装&#xff0c;那么恭喜你&#xff0c;刷到了这篇文章。 1. 将 VSCode 添加到系统路径 macOS 打开 VSCode。按下 Command Shift P 打开命令面板。 3。 输入 Shell Command: Install ‘code’ command in PATH …

四边形网格处理——沿Edge遍历 矩形域顶点提取

记录最近遇到的一个问题和解决方案。 最近遇到的问题&#xff1a;将一个五边形划分为四边形网格。 参考文献《Closed -form Quadrangulation of n-Sided Patches》&#xff0c;划分方式如下图所示&#xff0c;实际上是在五边形中间添加了一个顶点&#xff0c;顶点分别向五边形的…

代理软件更改IP地址会影响网速吗

在数字化时代&#xff0c;代理软件因其能够隐藏真实IP、突破地域限制、保护隐私安全等特性&#xff0c;而受到了广大用户的青睐。然而&#xff0c;许多用户在使用代理软件更改IP地址时&#xff0c;都会担心一个问题&#xff1a;这样的操作是否会影响网速&#xff1f;本文旨在深…

C#中的Frm_Welcome.Instance.Show(),是什么意思

Frm_Welcome.Instance.Show() 是一种常见的单例模式&#xff08;Singleton Pattern&#xff09;实现方式&#xff0c;通常用于在应用程序中确保某个窗体&#xff08;Form&#xff09;只有一个实例&#xff0c;并通过该实例显示窗体。以下是对这段代码的详细解释&#xff1a; 代…

高效 MyBatis SQL 写法一

高效 MyBatis SQL 写法一 前言 MyBatis 作为一款优秀的持久层框架&#xff0c;极大地简化了数据库操作。 然而&#xff0c;在实际开发中&#xff0c;XML 配置的编写仍然可能显得繁琐。 本文将分享一些 MyBatis 动态 SQL 的优质写法&#xff0c;帮助开发者提升效率并减少错误…

mongo命令执行js脚本的若干个示例

查询 示例1&#xff1a; echo "var versions db.version(); print(\"version is \" versions);" > 4.js mongo -u root -p pass --authenticationDatabase admin core 4.js示例2&#xff1a; echo "var versions db.version(); print(\"…