原题链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
if (n == 0){
return NULL;
}
map<int, int> mp;
for(int i = 0; i < n; i++){
mp[inorder[i]] = i;//记录中序遍历的坐标
}
TreeNode* root = buildTree(preorder, 0, n-1, inorder, 0, n-1, mp);
return root;
}
TreeNode* buildTree(vector<int>& preorder, int preorderStart, int preorderEnd, vector<int>& inorder, int inorderStart, int inorderEnd, map<int,int> mp){
if(preorderStart > preorderEnd){
return NULL;
}
int rootVal = preorder[preorderStart];
TreeNode* root = new TreeNode(rootVal);
if (preorderStart == preorderEnd) {
return root;
} else {
int rootIndex = mp[rootVal];
int leftNodes = rootIndex - inorderStart, rightNodes = inorderEnd - rootIndex;//leftNodes是根节点左边的节点数,rightNodes是根节点右边的节点数
TreeNode *leftSubtree = buildTree(preorder, preorderStart + 1, preorderStart + leftNodes, inorder, inorderStart, rootIndex - 1, mp);
TreeNode *rightSubtree = buildTree(preorder, preorderEnd - rightNodes + 1, preorderEnd, inorder, rootIndex + 1, inorderEnd, mp);
root->left = leftSubtree;
root->right = rightSubtree;
return root;
}
}