/*根据二叉树先序遍历和中序遍历的性质,递归的重建二叉树。*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() != inorder.size() || preorder.empty()) return nullptr;
return buildTree(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
}
TreeNode* buildTree(const vector<int> &preorder, int pre_left, int pre_right,
const vector<int> &inorder, int in_left, int in_right){
if(pre_left > pre_right) return nullptr;
TreeNode *root = new TreeNode(preorder[pre_left]);
int mid(in_left);
while(mid <= in_right && inorder[mid] != preorder[pre_left]) ++mid;
int left_length = mid - in_left;
root->left = buildTree(preorder, pre_left+1, pre_left+left_length,
inorder, in_left, mid-1);
root->right = buildTree(preorder, pre_left+left_length+1, pre_right,
inorder, mid+1, in_right);
return root;
}
};