该题主要是通过前序和中序遍历来还原一颗二叉树,核心的思路:在前序中找到根节点,根据该节点在中序遍历数组中的位置,根据中序划分左右子树,递归这个过程,还原一颗二叉树

本质上就是前序遍历中依次拿,不断地从中序遍历数组中缩小范围,范围为空的时候代表该范围拿不到了,需要换一颗子树。二叉树遍历的特点保证了前序遍历拿的元素一定可以在范围内找到

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
26
27
28
29
30
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {};
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {};
TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {};
};

class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
map<int, int> mp;
for (int i = 0; i < inorder.size(); i++) {
mp[inorder[i]] = i;
}
TreeNode* dummy = new TreeNode();

int k = 0;
auto dfs = [&](this auto&& dfs, int l, int r) -> TreeNode* {
if (l > r) return NULL;
TreeNode* root = new TreeNode(preorder[k++]);
root->left = dfs(l, mp[root->val] - 1);
root->right = dfs(mp[root->val] + 1, r);
return root;
};
return dfs(0, preorder.size() - 1);
}
};