从前序与中序遍历序列构造二叉树
class Solution {
private:
unordered_map<int, int> index;
public:
TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
if (preorder_left > preorder_right) {
return nullptr;
}
int preorder_root = preorder_left;
int inorder_root = index[preorder[preorder_root]];
TreeNode* root = new TreeNode(preorder[preorder_root]);
int size_left_subtree = inorder_root - inorder_left;
root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for (int i = 0; i < n; ++i) {
index[inorder[i]] = i;
}
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
}
};
从中序与后序遍历序列构造二叉树
class Solution {
int post_idx;
unordered_map<int, int> idx_map;
public:
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;
}
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);
}
};
从前序与后序遍历序列构造二叉树
class Solution {
public:
unordered_map<int,int> mapre;
unordered_map<int,int> mappost;
TreeNode* myBuildTree(vector<int>& pre,vector<int> post,int left,int right){
if(left>right){
return NULL;
}
TreeNode* root = new TreeNode(pre[left]);
if(right == left){
return root;
}
int left1 = mapre[ post[mappost [pre[left]] -1]];
int right1 = mapre[ post[mappost[pre[left]] -1] ]-1;
root->left = myBuildTree(pre, post, left + 1, right1);
root->right = myBuildTree(pre, post, left1, right);
return root;
}
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
for(int i=0;i<pre.size();i++){
mapre[pre[i]] = i;
mappost[post[i]] = i;
}
return myBuildTree(pre,post,0,pre.size()-1);
}
};