

递归法
前序遍历中第一个元素肯定是根节点。然后根据这个根节点 去中序遍历中找该元素。然后中序遍历中根的左边是左子树 右边是右子树。这样就知道了这个二叉树的左右子树。然后再根据左右子树的前序遍历、中序遍历同样的方法递归。(因为前序/中序遍历的左右子树仍然是前序/中序遍历)
vector中的区间是左闭右开。
vector<int> left_preorder(preorder.begin() + 1, preorder.begin() + index + 1);则是创建一个括号里左闭右开的区间的内容放到vector中。
cpp
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//先判断是否为空
if(preorder.empty()){
return nullptr;
}
TreeNode* root = new TreeNode(preorder[0]);
//找一下中序遍历中的根节点的索引
int index = 0;
//前序遍历的第一元素是根
int root1 = preorder[0];
for(int i =0;i<inorder.size();i++){
if(inorder[i] == root1){
index = i;
}
}
//确定左子树的前序遍历和中序遍历
vector<int> left_pre(preorder.begin()+1,preorder.begin()+index+1);
vector<int> left_inorder(inorder.begin(),inorder.begin()+index);
root->left = buildTree(left_pre,left_inorder);
vector<int> right_pre(preorder.begin()+index+1,preorder.end());
vector<int> right_inorder(inorder.begin()+index+1,inorder.end());
root->right = buildTree(right_pre,right_inorder);
return root;
}
};