Untitled
unknown
plain_text
10 months ago
2.0 kB
4
Indexable
public class Solution {
public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
// Map postorder values to their indices for quick lookup
HashMap<Integer, Integer> postIndexMap = new HashMap<>();
for (int i = 0; i < postorder.length; i++) {
postIndexMap.put(postorder[i], i);
}
return buildTree(preorder, postorder, 0, preorder.length - 1, 0, postorder.length - 1, postIndexMap);
}
private TreeNode buildTree(int[] preorder, int[] postorder,
int preStart, int preEnd,
int postStart, int postEnd,
HashMap<Integer, Integer> postIndexMap) {
if (preStart > preEnd || postStart > postEnd) {
return null;
}
// The current root is at preStart in preorder
TreeNode root = new TreeNode(preorder[preStart]);
// If there's only one node in this subtree, return it
if (preStart == preEnd) {
return root;
}
// Find the left child in preorder, and locate its index in postorder
int leftChild = preorder[preStart + 1];
int leftChildPostIndex = postIndexMap.get(leftChild);
// Calculate the size of the left subtree
int leftSubtreeSize = leftChildPostIndex - postStart + 1;
// Recursively build the left and right subtrees
root.left = buildTree(preorder, postorder,
preStart + 1, preStart + leftSubtreeSize,
postStart, leftChildPostIndex,
postIndexMap);
root.right = buildTree(preorder, postorder,
preStart + leftSubtreeSize + 1, preEnd,
leftChildPostIndex + 1, postEnd - 1,
postIndexMap);
return root;
}
}
Editor is loading...
Leave a Comment