class Solution {
public:
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
TreeNode* res = build(xianxu, 0, xianxu.size()-1,zhongxu, 0, zhongxu.size()-1); // 建立二叉树
queue<TreeNode *> q; // 层次遍历
q.push(res);
vector<int> ans;
while(!q.empty()){
int size = q.size(); //当前层队列元素个数
while(size--){
TreeNode *tmp = q.front(); q.pop();
if(size == 0)ans.push_back(tmp->val); //当前层最后一个元素加入ans,即右视图
if(tmp->left)q.push(tmp->left); // 下一层元素入队
if(tmp->right)q.push(tmp->right);
}
}
return ans;
}
TreeNode* build(vector<int>& xianxu,int l1,int r1, vector<int>& zhongxu, int l2, int r2){
int k;
for(k = l2; k <= r2; k++){
if(zhongxu[k] == xianxu[l1]) break; // 先序第一个在中序中的结点位置
}
if(k > r2) return NULL; // 没找到返回空
TreeNode * res = new TreeNode(xianxu[l1]); // 个根节点
res->left = build(xianxu, l1+1,l1+k-l2,zhongxu,l2,k-1); // 根节点左子树
res->right = build(xianxu, l1+k-l2+1, r1, zhongxu, k+1, r2); // 右子树
return res;
}
};