题目链接:199.二叉树的右视图
一、题目
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
提示:
- 二叉树的节点个数的范围是 [0,100]
- -100 <= Node.val <= 100
二、解题思路
根据链接: 层序遍历或者是画出几种类型的二叉树,可得出:
右侧所能看到的结点值是每一层最右边的值。
因此可以用层序遍历的算法,保存每一层最右边的结点,得到结果。
三、代码
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*> que;
if(root!=nullptr) que.push(root);
vector<int> res;
while(que.size()){
int size=que.size(); //每一层的结点数量
for(int i=0;i<size;i++){
TreeNode* node=que.front();
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
if(i==size-1) res.push_back(node->val);
}
}
return res;
}
};
四、层序遍历
- 层序遍历是指从左到右、一层一层地去遍历二叉树。(广度优先遍历)
- 需要借助队列实现。队列先进先出,符合层序遍历的需要。
- 代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
来源:力扣(LeetCode)