递归
- 前序+中序:使用前序第一个元素作为切割点
- 切割中序
- 【begin,end)
class Solution {
private:
TreeNode* traversal(vector<int>& preorder,int preorderbegin,int preorderend,vector<int>& inorder,int inorderbegin,int inorderend){
if(preorderbegin==preorderend) return nullptr;
int rootvalue=preorder[preorderbegin];
TreeNode* root=new TreeNode(rootvalue);
if(preorderend-preorderbegin==1) return root;
int delimitindex;
for(delimitindex=inorderbegin;delimitindex<inorderend;delimitindex++){
if(inorder[delimitindex]==rootvalue) break;
}
int inorderbeginleft=inorderbegin;
int inoderendleft=delimitindex;
int inoderbeginright=delimitindex+1;
int inorderendright=inorderend;
int preorderbeginleft=preorderbegin+1;
int preorderendleft=preorderbegin+1+delimitindex-inorderbegin;
int preorderbeginright=preorderbegin+1+(delimitindex-inorderbegin);
int preorderendright=preorderend;
root->left=traversal(preorder,preorderbeginleft,preorderendleft,inorder,inorderbeginleft,inoderendleft);
root->right=traversal(preorder,preorderbeginright,preorderendright,inorder,inoderbeginright,inorderendright);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(inorder.size()==0||preorder.size()==0) return nullptr;
return traversal(preorder,0,preorder.size(),inorder,0,inorder.size());
}
};