#include <deque>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求二叉树的右视图
     * @param preOrder int整型vector 先序遍历
     * @param inOrder int整型vector 中序遍历
     * @return int整型vector
     */

    // 恢复二叉树
    TreeNode* dfs(vector<int>& preOrder, vector<int>& inOrder)
    {
        int len_p=preOrder.size();
        int len_i=inOrder.size();

        if(len_p==0 || len_i==0)
            return nullptr;
        
        // 创建当前的根节点
        TreeNode* root = new TreeNode(preOrder[0]);

        for(int i=0; i<len_i; ++i)
        {
            // 找到根节点在中序遍历中的位置i,然后i其实就是前序遍历中左子树最后的节点的位置;
            if(inOrder[i] == preOrder[0])
            {
                // 左子树的前序遍历
                vector<int> f_p(preOrder.begin()+1,preOrder.begin()+i+1);
                // 左子树的中序遍历
                vector<int> f_i(inOrder.begin(),inOrder.begin()+i);
                // 当前根节点的左子树
                root->left = dfs(f_p,f_i);

                // 右子树的前序遍历
                vector<int> r_p(preOrder.begin()+i+1,preOrder.end());
                // 右子树的中序遍历
                vector<int> r_i(inOrder.begin()+i+1,inOrder.end());
                // 当前根节点的右子树
                root->right = dfs(r_p,r_i);

                break;
            }
        }

            return root;
    }


    vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) {
        // write code here

        TreeNode* root = dfs(preOrder,inOrder);

        // 广度优先搜索
        vector<int> ans;
        deque<TreeNode*> d;
        d.emplace_back(root);
        
        while(!d.empty())
        {
            int len = d.size();
            for(int i=0 ;i<len; ++i)
            {
                if(i==len-1)
                    ans.emplace_back(d.front()->val);

                if(d.front()->left)
                    d.emplace_back(d.front()->left);

                if(d.front()->right)
                    d.emplace_back(d.front()->right);

                d.pop_front();
            }
        }

        return ans;
    }
};