【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历

LeetCode 199. 二叉树的右视图

📌 题目描述

题目级别:中等

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

  • 示例 1:
    输入:root = [1,2,3,null,5,null,4]
    输出:[1,3,4]

💡 破题思路:根-右-左 DFS 探测

这道题最巧妙的解法不是层序遍历,而是带深度的 深度优先搜索 (DFS)

核心逻辑:

  1. 我们按照 "根节点 -> 右子树 -> 左子树" 的顺序进行递归。
  2. 为什么要先递归右子树?因为这样可以保证在每一个深度(层级),我们访问到的第一个节点一定是该层最右边的节点。
  3. 我们维护一个结果数组 res。在递归过程中,如果当前 res 的长度正好等于当前的深度 level,就说明当前深度是第一次被访问,那么当前节点就是我们要找的"右侧视图节点"。

性能优势:

相比于 BFS 需要维护一个队列,这种 DFS 写法空间复杂度更低,且代码极其简洁。


💻 C++ 代码实现 (DFS 规范版)

cpp 复制代码
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> res;
        dfs(root, 0, res);
        return res;
    }

    // 💡 重点:通过引用传递 res,并在递归时先走右边
    void dfs(TreeNode* root, int depth, vector<int>& res) {
        if (!root) return;

        // 如果结果集的大小等于当前深度,说明这一层最右边的节点刚被发现
        if (res.size() == depth) {
            res.push_back(root->val);
        }

        // 先往右边冲!保证右边节点先占坑
        dfs(root->right, depth + 1, res);
        // 再往左边走
        dfs(root->left, depth + 1, res);
    }
};
相关推荐
如竟没有火炬17 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi818 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
Qt程序员19 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
想吃火锅100519 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode
qeen8719 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
王老师青少年编程20 小时前
信奥赛C++提高组csp-s之搜索进阶(记忆化搜索案例实践3)
c++·记忆化搜索·方格取数·csp·信奥赛·csp-s·提高组
Titan202421 小时前
Linux动静态库
linux·服务器·c++
j_xxx404_21 小时前
MySQL表操作硬核解析:从 CREATE TABLE 到磁盘文件、ALTER TABLE 与 DDL 风险
运维·服务器·数据库·c++·mysql·adb·ai
wuminyu1 天前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
玖玥拾1 天前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·