class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求二叉树的右视图
     * @param preOrder int整型vector 先序遍历
     * @param inOrder int整型vector 中序遍历
     * @return int整型vector
     */
    TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {
        int n = preOrder.size();
        int m = vinOrder.size();
        if (n == 0 || m == 0)
            return nullptr;
        TreeNode* root = new TreeNode(preOrder[0]);
        for (int i = 0; i < vinOrder.size(); i++)
            if (preOrder[0] == vinOrder[i]) {
                vector<int> lpre(preOrder.begin() + 1, preOrder.begin() + i + 1);
                vector<int> lvin(vinOrder.begin(), vinOrder.begin() + i);
                root->left = reConstructBinaryTree(lpre, lvin);

                vector<int> rpre(preOrder.begin() + i + 1, preOrder.end());
                vector<int> rvin(vinOrder.begin() + i + 1, vinOrder.end());
                root->right = reConstructBinaryTree(rpre, rvin);

                break;
            }
        return root;
    }
    vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) {
        TreeNode* root=reConstructBinaryTree(preOrder, inOrder);
        vector<int> res;
        if(root==nullptr)
            return res;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            int length=q.size();
            for(int i=0;i<length;i++)
            {
                TreeNode* temp=q.front();
                q.pop();
                if(i==length-1)
                    res.push_back(temp->val);
                if(temp->left!=nullptr)
                    q.push(temp->left);
                if(temp->right!=nullptr)
                    q.push(temp->right);
            }
        }
        return res;
    }
};