难度:中等
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
限制:
0 <= 节点个数 <= 5000
解答
思路:先找前序的最前面那个数字,作为根。再在中序里面找到这个数字,这个数字前面的就是根的左边,后面的则是右边。然后递归进去。
知识:
1.容器的迭代
2.auto的使用
3.begin,end(end是容器最后一个数据的后面一个地址)
4.find的使用
复杂度:
时间复杂度:O(nlogn)?
空间复杂度:O(n)
代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return buildTreeCore(preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
}
TreeNode* buildTreeCore(vector<int>::iterator preorderBegin,vector<int>::iterator preorderEnd,vector<int>::iterator inorderBegin,
vector<int>::iterator inorderEnd){
if(preorderBegin==preorderEnd){
return nullptr;
}
auto node=new TreeNode(*preorderBegin);
auto it=find(inorderBegin,inorderEnd,node->val);
node->left=buildTreeCore(preorderBegin+1,preorderBegin+(it-inorderBegin)+1,inorderBegin,it);
node->right=buildTreeCore(preorderBegin+(it-inorderBegin)+1,preorderEnd,it+1,inorderEnd);
return node;
}