失败总是贯穿人生的始终
题目描述
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均 无重复 元素
inorder 均出现在 preorder
preorder 保证 为二叉树的前序遍历序列
inorder 保证 为二叉树的中序遍历序列
思路分析
-
首先需要知道手动是如何构造二叉树的
-
难点是如何找对应下标
完整代码
class Solution {
public:
TreeNode* buildTree(vector<int>& pre, vector<int>& in) {
//key是数组的值,value是下标
unordered_map<int,int>m;
for(int i=0;i<in.size();i++)
m[in[i]]=i;
//只关心有哪些参数,返回值是
return f(pre,0,pre.size()-1,in,0,in.size()-1,m);
}
TreeNode* f(vector<int>&pre,int l1,int r1,vector<int>&in,int l2,int r2,unordered_map<int,int>&m){
if(l1>r1)//base case
return NULL;
TreeNode*head=new TreeNode(pre[l1]);
int k=m[pre[l1]];//找k
head->left=f(pre,l1+1,l1+k-l2,in,l2,k-1,m);
head->right=f(pre,l1+k-l2+1,r1,in,k+1,r2,m);
return head;
}
};