题目地址:
https://www.acwing.com/problem/content/23/
输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
注意:
二叉树中每个节点的值都互不相同;
输入的前序遍历和中序遍历一定合法;
数据范围:
树中节点数量范围
[
0
,
100
]
[0,100]
[0,100]。
参考https://blog.csdn.net/qq_46105170/article/details/105898563。代码如下:
#include <vector>
#include <unordered_map>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
unordered_map<int, int> mp;
int n = inorder.size();
for (int i = 0; i < n; i++) mp[inorder[i]] = i;
return dfs(preorder, 0, n - 1, inorder, 0, n - 1, mp);
}
TreeNode* dfs(vector<int>& preorder, int pl, int pr, vector<int>& inorder, int il, int ir, unordered_map<int, int>& mp) {
if (pl > pr) return nullptr;
if (pl == pr) return new TreeNode(preorder[pl]);
int idx = mp[preorder[pl]];
int ls = idx - il, rs = ir - idx;
TreeNode* root = new TreeNode(preorder[pl]);
root->left = dfs(preorder, pl + 1, pl + ls, inorder, il, idx - 1, mp);
root->right = dfs(preorder, pl + ls + 1, pr, inorder, idx + 1, ir, mp);
return root;
}
};
时空复杂度 O ( n ) O(n) O(n), n n n是节点个数。