1 /*
 2  * @lc app=leetcode.cn id=105 lang=cpp
 3  *
 4  * [105] 从前序与中序遍历序列构造二叉树
 5  */
 6 
 7 // @lc code=start
 8 /**
 9  * Definition for a binary tree node.
10  * struct TreeNode {
11  *     int val;
12  *     TreeNode *left;
13  *     TreeNode *right;
14  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
15  * };
16  */
17 class Solution {
18 public:
19     /*
20     1)前序数组的第一个元素为根节点,根据根节点可将中序数组划分为左子树中序列表和右子树中序数组
21     2)又因为一棵树的中序数组长度与前序数组长度大小相同,所以可以根据长度划分前序数组为左右子树前序数组
22     3)对于根的左右结点,递归调用即可
23     */
24     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
25        if(preorder.empty()||inorder.empty()) return nullptr;
26 
27        TreeNode *root=new TreeNode(*preorder.begin());//begin返回的是迭代器,要取值的话加 *
28 
29        auto it=find(inorder.begin(),inorder.end(),*preorder.begin());
30 
31        vector<int> inleft(inorder.begin(),it); //左闭右开,所以inleft不包含it这个值
32        vector<int> inright(it+1,inorder.end());//加 1是为了跳过根节点
33        int sz=inleft.size();
34        vector<int> preleft(preorder.begin()+1,preorder.begin()+1+sz);
35        vector<int> preright(preorder.begin()+1+sz,preorder.end());
36        root->left=buildTree(preleft,inleft);
37        root->right=buildTree(preright,inright);
38 
39        return root;
40 
41     }
42 };
43 // @lc code=end