【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);
    }
};
相关推荐
cpp_25016 分钟前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解
晚笙coding8 分钟前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
咕白m62541 分钟前
通过 C++ 写入数据到 Excel 文档
c++·后端
兰令水1 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
qz5zwangzihan11 小时前
题解:Atcoder Beginner Contest abc467 F - Email Scheduling Optimization
c++·贪心·atcoder·平衡树·abc467·abc467_f·fhq-treap
郝学胜-神的一滴2 小时前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
星恒随风2 小时前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
退休倒计时2 小时前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
牢姐与蒯2 小时前
c++之异常
开发语言·c++·c++11
此生决int2 小时前
深入理解C++系列(02)——类和对象(上)
开发语言·c++