// 构造二叉树 + 层次遍历


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型vector 先序遍历
     * @param zhongxu int整型vector 中序遍历
     * @return int整型vector
     */
    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
       TreeNode *root= makeTree(xianxu,0, xianxu.size()-1, zhongxu, 0, zhongxu.size()-1);
       // bfs
       vector<int> ans;
       queue<TreeNode*> qu;
       qu.push(root);
       while(!qu.empty()){
           int size=qu.size();
           while(size--){
               TreeNode *p=qu.front();
               qu.pop();
               if(size==0) ans.push_back(p->val);
               if(p->left) qu.push(p->left);
               if(p->right) qu.push(p->right);
           }
       }
       return ans;
    }


private:
    TreeNode* makeTree(vector<int>& xianxu, int xl,int xr,vector<int>& zhongxu,int zl,int zr){
        if(xl>xr || zl > zr) return NULL;
        TreeNode *root=new TreeNode(xianxu[xl]);
        int mid=0;
        for(int i=0;i<zhongxu.size();i++){
            if(zhongxu[i]==xianxu[xl]){
                mid=i;
                break;
            }
        }

        root->left=makeTree(xianxu, xl+1 , xl+mid-zl ,zhongxu, zl , mid-1 );
        root->right=makeTree(xianxu, xl+mid-zl+1, xr, zhongxu, mid+1, zr);
        return root;
    }
};