【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);
    }
};
相关推荐
wuminyu1 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
土司大王3 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
土司大王4 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
无小道6 小时前
C++——列表初始化
c++·列表初始化
blueSatchel6 小时前
c++action 编写(ros-humble)
c++·ros2
a187927218318 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记8 小时前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展
老赵的博客8 小时前
c++面试之从虚函数表到Rtti一次性讲清楚
c++·qt
Navigator_Z8 小时前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode
傲世仙尊9 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++