某二叉树的先序遍历结果记录于整数数组 preorder,它的中序遍历结果记录于整数数组 inorder。请根据 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

inorder 均出现在 preorder

preorder 保证 为二叉树的前序遍历序列

inorder 保证 为二叉树的中序遍历序列

前序遍历的结果为[根节点,左子树前序,右子树前序]

中序遍历的结果为[左子树中序,根节点,右子树中序]

我们可以通过递归构造,只需要每次获取对应子树的前序和中序遍历数组,

也即在中序遍历结果中找到根节点索引即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
TreeNode *deduceTree(vector<int> &preorder, vector<int> &inorder) {
unordered_map<int, int> inorderMap;
int j = 0;
for (int i : inorder) {
inorderMap[i] = j++;
}
return buildTree(preorder, 0, preorder.size() - 1, inorderMap, 0,
inorder.size() - 1);
}
TreeNode *buildTree(vector<int> &preorder, int l1, int r1,
unordered_map<int, int> &inorderMap, int l2, int r2) {
if (r1 < l1 || r2 < l2)
return nullptr;
TreeNode *root = new TreeNode(preorder[l1]);
int rootIndex = inorderMap[root->val];
int lenLeft = rootIndex - l2;
root->left = buildTree(preorder, l1 + 1, l1 + lenLeft, inorderMap, l2,
rootIndex - 1);
root->right = buildTree(preorder, l1 + lenLeft + 1, r1, inorderMap,
rootIndex + 1, r2);
return root;
}
};