Given preorder and inorder traversal of a tree, construct the binary tree.
其实这道题弄清楚分段,思想还是挺简单的
preorder的分段:[preL] [preL+1, preL+index-inL] [preL+index-inL+1, preR]
inorder的分段:[iL, index-1] [index] [index+1, iR]
而[iL, index-1]区间的长度恰好等于index-inL,
直接上代码 参考Code_Ganker
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || preorder.length == 0 || inorder == null
|| inorder.length == 0)
return null;
HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
for (int i = 0; i < inorder.length; i++) {
hashMap.put(inorder[i], i);
}
return helper(hashMap, preorder, 0, preorder.length - 1, inorder, 0,
inorder.length - 1);
}
public TreeNode helper(HashMap<Integer, Integer> hashmap, int[] preorder,
int pL, int pR, int[] inorder, int iL, int iR) {
if (pL > pR || iL > iR)
return null;
TreeNode root = new TreeNode(preorder[pL]);
int index = hashmap.get(root.val);
root.left = helper(hashmap, preorder, pL + 1, pL + index - iL, inorder,
iL, index - 1);
root.right = helper(hashmap, preorder, pL + index - iL + 1, pR,
inorder, index + 1, iR);
return root;
}