递归思路 :每一次递归都可以看成对上图的分解;
1.先找树的头节点在中序的下标 即2
2.分别找子树的左右子树在前序和中序的下标
比如上图 前序左树1-2 前序右树3-8
中序左树0-1 中序右树3-8
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
TreeNode* dfs(vector<int>&preorder,vector<int>&inorder,int prestart,int preend,int instart,int inend){
TreeNode* head=new TreeNode(preorder[prestart]);
//1.在中序序列中找到前序序列的首个元素 记录在中序序列中的下标
int index=instart;
for(int i=instart;i<=inend;i++){
if(inorder[i]==preorder[prestart]){
index=i;
break;
}
}
//2.分别递归左子树序列和右子树序列
if(index-instart>0){
head->left=dfs(preorder,inorder,prestart+1,prestart+index-instart,instart,index-1);
}
else{//①没有左子树
head->left=nullptr;
}
if(inend-index>0){
head->right=dfs(preorder,inorder,prestart+index-instart+1,preend,index+1,inend);
}
else{//②没有右子树
head->right=nullptr;
}
return head;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size()==0)return nullptr;
TreeNode* ans=dfs(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
return ans;
}
};