105. 从前序与中序遍历序列构造二叉树

难度中等719
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7

  1. HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
  2. public TreeNode buildTree(int[] preorder, int[] inorder) {
  3. for(int i=0;i<inorder.length;i++){
  4. map.put(inorder[i],i);
  5. }
  6. return helper(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
  7. }
  8. public TreeNode helper(int[] preorder, int[] inorder,int pstart,int pend,int start,int end){
  9. if(pstart>pend){
  10. return null;
  11. }// 必须有
  12. TreeNode root = new TreeNode(preorder[pstart]);
  13. int idxroot = map.get(preorder[pstart]);
  14. int leftSize= idxroot - start;//
  15. root.left = helper(preorder,inorder,pstart+1,pstart+leftSize,start,idxroot-1);
  16. root.right= helper(preorder,inorder,pstart+leftSize+1,pend,idxroot+1,end);//+1
  17. return root;
  18. }