# 105-Construct Binary Tree from Preorder and Inorder Traversal
###### tags: `Medium`
Question:
https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
Reference:
1. https://bear-1111.medium.com/leetcode-105-construct-binary-tree-from-preorder-and-inorder-traversal-9ca1f9246347
2. https://www.youtube.com/watch?v=9rarSk7946Q&ab_channel=%E5%9B%BE%E7%81%B5%E6%98%9F%E7%90%83TuringPlanet
```cpp=
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* buildHelper(int preStart, int preEnd, int inStart, int inEnd,
vector<int>& preorder, vector<int>& inorder, unordered_map<int, int>& node_map) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}
TreeNode* root = new TreeNode(preorder[preStart]);
int index = node_map[root->val];
root->left = buildHelper(preStart + 1, preEnd, inStart, index - 1, preorder, inorder, node_map);
root->right = buildHelper(preStart + index - inStart + 1, preEnd, index + 1, inEnd, preorder, inorder, node_map);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
unordered_map<int, int> node_map;
for (int i = 0; i < inorder.size(); i++) {
node_map[inorder[i]] = i;
}
return buildHelper(0, preorder.size() - 1, 0, inorder.size() - 1, preorder, inorder, node_map);
}
};
```