105. 从前序与中序遍历序列构造二叉树

前序构建树

其中,通过preoder确定根,然后通过inorder分左右子树

比如上边图片的例子,通过preorder知道3为根,查找inorder,找到3所在的位置,分成中序的两个区间,记录左子树节点的个数,将前序序列也分为两个区间,然后递归处理左子树和右子树

我写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:

TreeNode* buildTree(vector<int> preorder, vector<int> inorder) {
if(preorder.size()==0)
{
return nullptr;
}
auto mid= find(inorder.begin(),inorder.end(), preorder[0]);
int nl=mid-inorder.begin();

TreeNode* root=new TreeNode(preorder[0]);

root->left=buildTree(vector<int>(preorder.begin()+1,preorder.begin()+1+nl) ,vector<int>(inorder.begin(),mid));
root->right=buildTree(vector<int>(preorder.begin()+1+nl, preorder.end()) ,vector<int>(mid+1,inorder.end()));

return root;
}
};

另一种写法