#include <queue>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型vector 先序遍历
     * @param zhongxu int整型vector 中序遍历
     * @return int整型vector
     */
    TreeNode* buildTree(vector<int>& pre, vector<int>& vin) {
        int pre_size = pre.size();
        int vin_size = vin.size();

        if (pre_size == 0 || vin_size == 0)
            return nullptr;

        TreeNode* root = new TreeNode(pre[0]);

        for (int i = 0; i < vin_size; i++) {
            if (pre[0] == vin[i]) {

                //左子树先序
                vector<int > leftpre(pre.begin() + 1, pre.begin() + 1 + i);
                //左子树中序
                vector<int > leftvin(vin.begin(), vin.begin() + i);
                //左孩子
                root->left = buildTree(leftpre, leftvin);
                //右子树先序
                vector<int > rightpre(pre.begin() + i + 1, pre.end());
                //右子树先序
                vector<int > rightvin(vin.begin() + i + 1, vin.end());
                //右孩子
                root->right = buildTree(rightpre, rightvin);
                break;
            }
        }
        return root;
    }
    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
        // write code here

        TreeNode* root = buildTree(xianxu, zhongxu);
        vector<int > rightview = {};

        if (xianxu.size() == 0 || zhongxu.size() == 0) {
            return rightview;
        }

        queue<TreeNode *> qu;
        qu.push(root);
        bool isRight = true;
        while (!qu.empty()) {
            int size = qu.size();
            isRight = true;
            while (size--) {
                TreeNode* node = qu.front();
                qu.pop();
                if (isRight) {
                    rightview.push_back(node->val);
                    isRight = false;
                }

                if (node->right) {
                    qu.push(node->right);
                }
                if (node->left) {
                    qu.push(node->left);
                }
            }
        }

        return rightview;


    }
};