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
- 二叉树的节点个数的范围是
思路:
BFS:
class Solution {
public:
vector<int>ans;
//采用BFS深度优先搜索
vector<int> rightSideView(TreeNode* root) {
if(root==nullptr)return ans;
queue<TreeNode*>pq;//BFS核心数据结构
pq.push(root);
while(!pq.empty()){
int sz=pq.size();
//队列的顶部元素就是能看见的节点数,即最右侧元素
TreeNode* cur=pq.front();
for(int i=0;i<sz;i++){
TreeNode* p=pq.front();
pq.pop();
//注意,这里要从右向左判断,才能保证队列顶部元素是最右侧元素
if(p->right!=nullptr)pq.push(p->right);
if(p->left!=nullptr)pq.push(p->left);
}
ans.push_back(cur->val);
}
return ans;
}
};
DFS:
本题使用DFS深度优先搜索要想到ans容器中元素数量和二叉树深度的关系,同时要注意遍历时要先去遍历右子树再去遍历左子树
class Solution {
public:
//DFS
vector<int> ans;
//记录递归的层数
int dep=0;
vector<int> rightSideView(TreeNode* root) {
traver(root);
return ans;
}
//二叉树遍历
void traver(TreeNode* root){
if(root==nullptr)return;
//前序遍历
dep++;
if(ans.size()<dep){
//这一层没有记录值
//说明root就是右侧视图的第一个节点
ans.push_back(root->val);
}
//这里要先遍历右子树再去遍历左子树
//这样首先遍历的一定是右侧节点
traver(root->right);
traver(root->left);
//回到上一层
dep--;
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16143408.html