105. 从前序与中序遍历序列构造二叉树
class Solution {
private:
int pre_idx;
unordered_map<int, int> idx_map;
TreeNode* helper(int in_left, int in_right, vector<int>& inorder, vector<int>& preorder){
if (in_left > in_right) {
return nullptr;
}
int root_val = preorder[pre_idx];
TreeNode* root = new TreeNode(root_val);
int index = idx_map[root_val];
pre_idx++;
root->left = helper(in_left, index - 1, inorder, preorder);
root->right = helper(index + 1, in_right, inorder, preorder);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
pre_idx = 0;
int idx = 0;
for (auto& val : inorder) {
idx_map[val] = idx++;
}
return helper(0, (int)inorder.size() - 1, inorder, preorder);
}
};
106. 从中序与后序遍历序列构造二叉树
class Solution {
private:
int post_idx;
unordered_map<int, int> idx_map;
TreeNode* helper(int in_left, int in_right, vector<int>& inorder, vector<int>& postorder){
if (in_left > in_right) {
return nullptr;
}
int root_val = postorder[post_idx];
TreeNode* root = new TreeNode(root_val);
int index = idx_map[root_val];
post_idx--;
root->right = helper(index + 1, in_right, inorder, postorder);
root->left = helper(in_left, index - 1, inorder, postorder);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
post_idx = (int)postorder.size() - 1;
int idx = 0;
for (auto& val : inorder) {
idx_map[val] = idx++;
}
return helper(0, (int)inorder.size() - 1, inorder, postorder);
}
};
对比分析
- idx_map用来及记录中序中,元素为key,对应元素在index映射
- 核心思想是:根据求前序或者后序的第一个元素或者最后一个元素来得到root元素值,借助idx_map获取该值在中序的下标,再根据下标将中序切分为左子树和右子树;
- 特别注意:递归求解时左子树和右子树的顺序。