199. 二叉树的右视图
题目描述
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
提示:
- 二叉树的节点个数的范围是
[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<vector<int>> result;
// 层序遍历,使用队列来存放节点
queue<TreeNode*>que;
if(root!=NULL){
que.push(root);
}
// 遍历
while(!que.empty()){
// 确定每一层的元素个数
int size = que.size();
vector<int> v;
for(int i = 0;i<size;i++){
TreeNode *node = que.front();
que.pop();
v.push_back(node->val);
// 左
if(node->left){
que.push(node->left);
}
//右
if(node->right){
que.push(node->right);
}
}
result.push_back(v);
}
// 上面全是层序遍历的代码
// 下面是选择每层可以看到的节点,最后返回新的数组
vector<int> ret;
for(int i = 0 ; i <result.size();i++){
int index = result[i].size();
// 将每一层的最后一个元素加入到结果集
ret.push_back(result[i][index-1]);
}
return ret;
}
};
改进代码
遍历每一层的时候,判断是否遍历到这一层的最后一个节点,如果是最后一个就将其对应的值存入结果数组中。
/**
* 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) {
// 层序遍历
// 使用队列来存储节点
queue<TreeNode*>que;
if(root!=NULL){
que.push(root);
}
// 存放符合条件的节点值
vector<int> result;
// 遍历
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;
}
};