​​199. 二叉树的右视图​​

题目描述

给定一个二叉树的 根节点 ​​root​​,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

【力扣-二叉树】3、二叉树的右视图(199)_C++

输入: [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;

}
};

【力扣-二叉树】3、二叉树的右视图(199)_数组_02

改进代码


遍历每一层的时候,判断是否遍历到这一层的最后一个节点,如果是最后一个就将其对应的值存入结果数组中。


/**
* 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;

}
};

【力扣-二叉树】3、二叉树的右视图(199)_数组_03