前需遍历的结果将中序遍历分为了两部分,如第一部分数量为i,对应前序遍历除第一个的前i个,第二部分数量为j,则对应前序遍历的后j个
public class Offer_7 {
Map<Integer, Integer> hashmap = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
int len = preorder.length;
for(int i = 0; i < len; i++){
hashmap.put(inorder[i], i);
}
return dfs(preorder, inorder, 0, len - 1, 0, len - 1);
}
private TreeNode dfs(int[] preorder, int[] inorder, int p_l, int p_r, int i_l, int i_r) {
if(p_l > p_r) return null;
TreeNode node = new TreeNode();
node.val = preorder[p_l];
int i = hashmap.get(preorder[p_l]);
node.left = dfs(preorder, inorder, p_l + 1, p_l + i - i_l, i_l, i- 1);
node.right = dfs(preorder, inorder, p_l + i - i_l + 1, p_r, i + 1, i_r);
return node;
}
}