给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4] 输出: [1,3,4]
示例 2:
输入: [1,null,3] 输出: [1,3]
示例 3:
输入: [] 输出: []
实际的难点
很不错的题解(一层一层遍历)
/**
* 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> res;
if(!root) return res;
//注意这里存放树节点一定要定义成<TreeNode*>类型
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int count = q.size(); //确保只遍历当前这一层
TreeNode* node = nullptr;
//循环到最后 node 指针刚好指向这一层最右边的节点
while(count--)
{
node = q.front(); //每次往右边取一个
q.pop();
//if(node->right) q.push(node->right);
//从最左到最右边
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
res.push_back(node->val);
}
return res;
}
};
深度优先搜索题解(很巧妙)
思路:先递归右子树,再递归左子树,当某个深度首次到达时,对应的节点就在右视图中。
class Solution {
//提前定义好,不需要传递了
vector<int> ans;
void dfs(TreeNode* node, int depth) {
if (node == nullptr) {
return;
}
//这个if判断很巧妙
if (depth == ans.size()) { // 这个深度首次遇到
ans.push_back(node->val);
}
dfs(node->right, depth + 1); // 先递归右子树,保证首次遇到的一定是最右边的节点
dfs(node->left, depth + 1);
}
public:
vector<int> rightSideView(TreeNode* root) {
dfs(root, 0); //重要的就是根节点还有 *深度
return ans;
}
};