题目描述
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <—
/
2 3 <—
\
5 4 <—
思路
这道题感觉就是遍历,dfs和bfs应该都能解决,不过就是这个条件一开始看起来感觉有些麻烦。
我用的是bfs,定义一个队列存储节点以及节点所处层的深度,定义current为预备右视图元素,进入while循环,弹出队首元素,若已经进入下一层,说明上一个预备元素就是正确的元素,加入到结果集res中。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
if(root == NULL)
return res;
queue<pair<TreeNode*,int>> q;
q.push({root,0});
int tmp = 0;
int current;
while(!q.empty()){
auto p = q.front();
q.pop();
TreeNode *root = p.first;
int h = p.second;
//如果已经到下一层
if(h > tmp){
tmp = h;
res.push_back(current);
}
current = root -> val;
if(root -> left)
q.push({root -> left,h+1});
if(root -> right)
q.push({root -> right,h+1});
}
//最后一个元素没有下一层。
res.push_back(current);
return res;
}
};