#include<iostream>
#include<vector>
#include<queue>

using namespace std;

 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 {
public:
    vector<int> rightSideView(TreeNode* root) {
        queue<TreeNode *> que;
        vector<int> rlt;
        if(root == nullptr) return rlt;
        que.push(root);
        while(!que.empty()){
            queue< TreeNode *> tmp_que;
            TreeNode * node;
            while(!que.empty()){
                node = que.front();
                tmp_que.push(node);
                que.pop();
            }
            rlt.push_back(node->val);
            while(!tmp_que.empty()){
                node = tmp_que.front();
                if(node->left != nullptr){
                    que.push(node->left);
                }
                if(node->right != nullptr){
                    que.push(node->right);
                }
                tmp_que.pop();
            }
        }
        return rlt;
    }
};