题面
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: root = [1,2,3,null,5,null,4]
输出:[1,3,4]
解释:

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

示例 3:
输入: root = [1,null,3]
输出:[1,3]
示例 4:
输入: root = []
输出:[]
提示:
- 二叉树的节点个数的范围是
[0,100] -100 <= Node.val <= 100
分析
-
显然就是层序遍历的最右边的节点
-
代码实现
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), * right(right) {} * }; */ class Solution { public: vector<int> rightSideView(TreeNode* root) { vector<int> result; if (root == nullptr) return result; queue<TreeNode*> que; que.push(root); while (!que.empty()) { int size = que.size(); for (int i = 0; i < size; i++) { TreeNode* node = que.front(); que.pop(); if (i == size - 1) result.push_back(node->val); if (node->left) que.push(node->left); if (node->right) que.push(node->right); } } return result; } }; -
另一种视角中,先递归右子树,再递归左子树,当某个深度首次到达时,对应的首个节点就在右视图中
class Solution { public: vector<int> rightSideView(TreeNode* root) { vector<int> ans; auto dfs = [&](this auto&& dfs, TreeNode* node, int depth) -> void { if (node == nullptr) { return; } if (depth == ans.size()) { // 这个深度首次遇到 ans.push_back(node->val); } dfs(node->right, depth + 1); // 先递归右子树,保证首次遇到的一定是最右边的节点 dfs(node->left, depth + 1); }; dfs(root, 0); return ans; } };
这篇文档有帮助吗?