class Solution {
private HashMap<Integer, Integer> indexMap;
private int[] preorder;
private int[] inorder;
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
this.inorder = inorder;
if (preorder.length == 0) return null;
indexMap = new HashMap<>();
for (int i = 0; i < inorder.length; i++) {
indexMap.put(inorder[i], i);
}
return dfs(0, preorder.length - 1, 0, inorder.length - 1);
}
private TreeNode dfs(int preLeft, int preRight, int inLeft, int inRight) {
if (preLeft > preRight || inLeft > inRight) return null;
int rootValue = preorder[preLeft];
Integer rootIndex = indexMap.get(rootValue);
TreeNode root = new TreeNode(rootValue);
int leftLen = rootIndex - inLeft;
root.left = dfs(preLeft + 1, preLeft + leftLen, inLeft, rootIndex - 1);
root.right = dfs(preLeft + leftLen + 1, preRight, rootIndex + 1, inRight);
return root;
}
}