给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
思路:层序遍历。遍历时将每一层的最后一个节点加入结果中。如何判断节点是最后一个?
层次遍历时,将节点与层数绑定为pair,压入队列时,将节点与层数同时压入队列,并记录每一层中出现的最后一个节点。在层次遍历中,每一层中的最后一个节点最后遍历到,随时更新对每层的最后一个节点即可。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
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;
queue<pair<TreeNode*,int>> Q;
if(!root) {
return;
}
Q.push(make_pair(root,0)); //根节点入队
while(!Q.empty()) {
TreeNode *node = Q.front().first;
int depth = Q.front().second;
Q.pop();
if(res.size() == depth) { //当前层的第一个节点
res.push_back(node->val);
}
else {
res[depth] = node->val; //非当前层的第一个节点,直接用它的值更新结果中的第depth个值 }
if(node->left) {
Q.push(make_pair(node->left,depth+1));
}
if(node->right) {
Q.push(make_pair(node->right,depth+1));
}
}
return res;
}
};
int main() {
TreeNode a(1);
TreeNode b(2);
TreeNode c(5);
TreeNode d(4);
TreeNode e(4);
TreeNode f(6);
a.left = &b;
a.right = &c;
b.left = &d;
b.right = &e;
c.right = &f;
Solution s;
vector<int> res = s.rightSideView(&a);
cout<<res.size()<<endl;
for(int i = 0; i < res.size(); i++) {
cout<<res[i]<<" ";
}
return 0;
}