classSolution{ public TreeNode buildTree(int[] preorder, int[] inorder){ int n = preorder.length; Map<Integer, Integer> index = new HashMap<>(n); // 预分配空间 for (int i = 0; i < n; i++) { index.put(inorder[i], i); } return dfs(preorder, 0, n, inorder, 0, n, index); // 左闭右开区间 }
private TreeNode dfs(int[] preorder, int preL, int preR, int[] inorder, int inL, int inR, Map<Integer, Integer> index){ if (preL == preR) { // 空节点 returnnull; } int leftSize = index.get(preorder[preL]) - inL; // 左子树的大小 //左子树在前序遍历中的大小[pre+1,pre+1+leftSize),pre的位置是根节点,中序遍历中大小为[inL,inL+leftSize),inL+leftSize的位置是根节点 TreeNode left = dfs(preorder, preL + 1, preL + 1 + leftSize, inorder, inL, inL + leftSize, index); //右子树在前序遍历中的大小[pre+1+leftSize,preR),在中序遍历中的大小为[inL+1+leftSize,inR) TreeNode right = dfs(preorder, preL + 1 + leftSize, preR, inorder, inL + 1 + leftSize, inR, index); returnnew TreeNode(preorder[preL], left, right); } }