Recursive split with an index map
Time O(n) Space O(n)Keep a pointer into preorder. build(lo, hi) over an inorder range: take the next preorder value as root, find its inorder index m, build left from (lo, m − 1) then right from (m + 1, hi).
import java.util.HashMap;
import java.util.Map;
class Solution {
private int pre = 0;
private final Map<Integer, Integer> index = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
for (int i = 0; i < inorder.length; i++) index.put(inorder[i], i);
return build(preorder, 0, inorder.length - 1);
}
private TreeNode build(int[] preorder, int lo, int hi) {
if (lo > hi) return null;
TreeNode root = new TreeNode(preorder[pre++]);
int m = index.get(root.val);
root.left = build(preorder, lo, m - 1); // left must be built first: preorder lists it next
root.right = build(preorder, m + 1, hi);
return root;
}
}Verdict: Each node is created once with an O(1) lookup.