力扣hot100——二叉树的右视图
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
解题思路:
// 每一层的最右边数据
// 层序遍历找出每层看到的元素
/**
* 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;
vector<vector<int>> level_res;
level_order(root, level_res); // 获取层序遍历结果
for (auto& v : level_res) {
res.push_back(v.back()); // 取每一层的最后一个元素
}
return res;
}
void level_order(TreeNode* root, vector<vector<int>>& v) {
if (!root) {
return; // 如果根节点为空,直接返回
}
queue<TreeNode*> q;
q.push(root); // 将根节点加入队列
while (!q.empty()) {
int level_size = q.size(); // 当前层的节点数量
vector<int> level_v; // 存储当前层的节点值
// 遍历当前层的所有节点
for (int i = 0; i < level_size; i++) {
auto temp = q.front();
q.pop();
level_v.push_back(temp->val); // 将当前节点的值加入当前层的向量
// 将当前节点的左右子节点加入队列
if (temp->left) q.push(temp->left);
if (temp->right) q.push(temp->right);
}
v.push_back(level_v); // 将当前层的节点值加入结果
}
}
};