
class Solution:
def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
def myBuildTree(pre_left, pre_right, post_left, post_right):
if pre_left > pre_right:
return None
if pre_left == pre_right:
return TreeNode(preorder[pre_left])
idx = dic[preorder[pre_left + 1]]
left_size = idx - post_left + 1
root = TreeNode(preorder[pre_left])
root.left = myBuildTree(pre_left + 1, pre_left + left_size, post_left, idx)
root.right = myBuildTree(pre_left + left_size + 1, pre_right, idx + 1, post_right - 1)
return root
dic = {x : i for i, x in enumerate(postorder)}
n = len(preorder)
return myBuildTree(0, n - 1, 0, n - 1)

class Solution {
private:
unordered_map<int, int> postDict;
public:
TreeNode* myBuildTree(vector<int> &preorder, vector<int> &postorder, int pre_left, int pre_right, int post_left, int post_right){
if (pre_left > pre_right){
return nullptr;
}
if (pre_left == pre_right){
return new TreeNode(preorder[pre_left]);
}
int idx = postDict[preorder[pre_left + 1]];
int left_size = idx - post_left + 1;
TreeNode* root = new TreeNode(preorder[pre_left]);
root->left = myBuildTree(preorder, postorder, pre_left + 1, pre_left + left_size, post_left, idx);
root->right = myBuildTree(preorder, postorder, pre_left + left_size + 1, pre_right, idx + 1, post_right - 1);
return root;
}
TreeNode *constructFromPrePost(vector<int> &preorder, vector<int> &postorder) {
int n = preorder.size();
for (int i = 0; i < n; i++) {
postDict[postorder[i]] = i;
}
return myBuildTree(preorder, postorder, 0, n - 1, 0, n - 1);
}
};
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
dic = {x : i for i, x in enumerate(inorder)}
def dfs(in_left, in_right, post_left, post_right):
if post_left > post_right:
return None
idx = dic[postorder[post_right]]
left_size = idx - in_left
root = TreeNode(postorder[post_right])
root.left = dfs(in_left, idx - 1, post_left, post_left + left_size - 1)
root.right = dfs(idx + 1, in_right, post_left + left_size, post_right - 1)
return root
n = len(inorder)
return dfs(0, n - 1, 0, n - 1)

class Solution {
private:
unordered_map<int, int> dic;
public:
TreeNode* myBuildTree(vector<int>& inorder, vector<int>& postorder, int in_left, int in_right, int post_left, int post_right){
if (in_left > in_right){
return nullptr;
}
int idx = dic[postorder[post_right]];
int left_size = idx - in_left;
TreeNode* root = new TreeNode(postorder[post_right]);
root->left = myBuildTree(inorder, postorder, in_left, idx - 1, post_left, post_left + left_size - 1);
root->right = myBuildTree(inorder, postorder, idx + 1, in_right, post_left + left_size, post_right - 1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n = postorder.size();
for (int i = 0; i < n; ++i){
dic[inorder[i]] = i;
}
return myBuildTree(inorder, postorder, 0, n - 1, 0, n - 1);
}
};
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
def dfs(pre_left, pre_right, in_left, in_right):
if pre_left > pre_right:
return None
idx = dic[preorder[pre_left]]
left_size = idx - in_left
root = TreeNode(preorder[pre_left])
root.left = dfs(pre_left + 1, pre_left + left_size, in_left, idx - 1)
root.right = dfs(pre_left + left_size + 1, pre_right, idx + 1, in_right)
return root
n = len(preorder)
dic = {element : i for i, element in enumerate(inorder)}
return dfs(0, n - 1, 0, n - 1)

class Solution {
private:
unordered_map<int, int> dic;
public:
TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right){
if (pre_left > pre_right){
return nullptr;
}
int idx = dic[preorder[pre_left]];
int left_size = idx - in_left;
TreeNode* root = new TreeNode(preorder[pre_left]);
root->left = myBuildTree(preorder, inorder, pre_left + 1, pre_left + left_size, in_left, idx - 1);
root->right = myBuildTree(preorder, inorder, pre_left + left_size + 1, pre_right, idx + 1, in_right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for (int i = 0; i < n; ++i){
dic[inorder[i]] = i;
}
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
}
};
用于 理解 的解法
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
if not preorder:
return None
idx = inorder.index(preorder[0])
left = self.buildTree(preorder[1 : 1 + idx], inorder[: idx])
right = self.buildTree(preorder[1 + idx : ], inorder[idx + 1: ])
return TreeNode(preorder[0], left, right)
