199. Binary Tree Right Side View
思路:
这一题比较容易想到BFS,如果我们从左到右的向队列加入节点,那么最后一个加入的节点就是我们能看到节点,那么就遍历到这层最后一个取出节点的时候就把他加入进res数组。也可以从右到左,把第一个添加进队列里面的节点放入res数组。
代码:
/**
* 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 {
private:
vector<int> res;
public:
vector<int> rightSideView(TreeNode* root) {
if(root==nullptr) return {};
vector<int> res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int size=q.size();
for(int i=0;i<size;++i){
TreeNode* node = q.front(); q.pop()
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
if(i==size-1){
res.push_back(node->val);
}
}
}
return res;
}
};
DFS:
因为我们是从右侧看,那么我们先DFS右子树,如果右节点为NULL,那么我们才去遍历左节点,那么我们就把第一次遍历到的节点加入进去即可。
代码:
/**
* 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 {
private:
vector<int> res;
void dfs(TreeNode* root,int depth){
if(root==nullptr) return ;
if(depth==res.size()){ //因为depth从0开始算,当depth等于size意思为depth增加到新的深度了,这个深度下的元素还没有加入res,同时当加入后size大于depth,那么左节点就不会被加入。也正是加入后size不等于depth,然后depth+1才会等于size,才会是加入元素的条件。
res.push_back(root->val);
}
depth++;
dfs(root->right,depth);
dfs(root->left,depth);
}
public:
vector<int> rightSideView(TreeNode* root) {
dfs(root,0);
return res;
}
};