题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
限制:
0 <= 节点个数 <= 5000
代码
class Solution {
public:
unordered_map<int, int> index;
int n;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir){
if(pl > pr) return NULL;
int cur = index[preorder[pl]];
TreeNode* root = new TreeNode(preorder[pl]);
root->left = buildTree(preorder, inorder, pl + 1, pl + cur - il, il, cur - 1);
root->right = buildTree(preorder, inorder, pl + 1 + cur - il, pr, cur + 1, ir);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
n = preorder.size();
for(int i = 0 ;i < n;i++){
index[inorder[i]] = i;
}
TreeNode * root = buildTree(preorder, inorder, 0, n - 1, 0, n - 1);
return root;
}
};
时间复杂度O(n)
空间复杂度O(n)