105. 从前序与中序遍历序列构造二叉树
今天依然是二叉树,怀疑人生的一天,会画二叉树,但是用代码就不会,感叹智商
看了很多遍题解这才终于搞明白,以后画图预演一定好好总结规律再写代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode* root ;
root = build(preorder,inorder,0,inorder.size()-1,0,inorder.size()-1);
return root;
}
// pre_left和pre_right是当前子二叉树在前序遍历中的位置
TreeNode* build(vector<int>& preorder,vector<int>& inorder,int left,int right,int pre_left,int pre_right){
int inorder_root = left;
int i;
//下面题解使用的是map,大大缩短时间
for(i = left; i<=right; i++){
if(inorder[i] == preorder[pre_left]){
inorder_root = i;
break;
}
}
if(left>right){
return nullptr;
}
TreeNode* root = new TreeNode();
root->val=preorder[pre_left];
root->left=build(preorder,inorder,left,inorder_root-1,pre_left+1,pre_left+inorder_root-left);
root->right=build(preorder,inorder,inorder_root+1,right,pre_left+inorder_root-left+1,pre_right);
return root;
}
};