Given preorder and inorder traversal of a tree, construct the binary tree.
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
/**
* 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* buildTree(vector<int>& preorder, vector<int>& inorder) {
return buildTree(preorder, inorder, 0, 0, preorder.size());
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int preroot, int inroot, int size) {
if (size <= 0) return nullptr;
const auto root = new TreeNode(preorder[preroot]);
if (size == 1) return root;
const auto center = search(inorder, inroot, inroot + size, root->val);
const auto leftsize = center - inroot;
root->left = buildTree(preorder, inorder, preroot + 1, inroot, leftsize);
root->right = buildTree(preorder, inorder, preroot + 1 + leftsize, center + 1, size - leftsize - 1);
return root;
}
inline int search(vector<int> &nums, int start, int end, int target) {
for (int i = start; i < end; ++i) {
if (nums[i] == target) return i;
}
return -1;
}
};