/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
unordered_map<int, int> vin_rd;
vector<int> res;
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型vector 先序遍历
* @param zhongxu int整型vector 中序遍历
* @return int整型vector
*/
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
// write code here
TreeNode* root = reConstructBinaryTree(xianxu, zhongxu);
cal(root);
return res;
}
void cal(TreeNode* root){
queue<TreeNode*> Q;
Q.push(root);
while(!Q.empty()){
int cur_size = Q.size();
for(int i=0; i<cur_size; i++){
auto node = Q.front();
Q.pop();
if(node->left) Q.push(node->left);
if(node->right) Q.push(node->right);
if(i == cur_size-1){
res.push_back(node->val);
}
}
}
}
TreeNode* reConstructBinaryTree(vector<int>& pre,vector<int>& vin) {
if(pre.size() == 0){
return nullptr;
}
for(int i=0; i<vin.size(); i++){
vin_rd[vin[i]] = i;
}
return create(pre, vin, 0, pre.size()-1, 0, vin.size()-1);
}
TreeNode* create(vector<int>& pre,vector<int>& vin, int a, int b, int c, int d){
if(a > b){
return nullptr;
}
TreeNode* root = new TreeNode(0);
root->val = pre[a];
int index = vin_rd[pre[a]];
root->left = create(pre, vin, a+1, a+index-c, c, index-1);
root->right = create(pre, vin, a+index-c+1, b, index+1, d);
return root;
}
};