【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);
    }
};
相关推荐
rannn_11119 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
不会代码的小猴20 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站20 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
青瓦梦滋21 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
一只旭宝21 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林21 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
蒸蒸yyyyzwd1 天前
秋招不熟悉力扣学习笔记1
笔记·学习·leetcode
Lhan.zzZ1 天前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
白狐_7981 天前
408数据结构第5章:树与二叉树②——遍历、线索树、森林与哈夫曼
数据结构·算法·深度优先
zh路西法1 天前
【3D SLAM源码解读系列】(二)Small_gicp——5 个积木搭出最优点云配准
c++·pcl·icp·fastgicp·smallgicp·gicp