题目:
给定一棵树的前序遍历 preorder 与中序遍历  inorder。请构造二叉树并返回其根节点。
================================================
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
================================================
Input: preorder = [-1], inorder = [-1]
Output: [-1]

tree.jpeg

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
      public static TreeNode buildTree(int[] preorder, int[] inorder) {
            //边界判断
            if(preorder==null || inorder==null || preorder.length != inorder.length){
                return  null;
            }
            HashMap<Integer,Integer> valueHashMap=new HashMap<>();
            for(int i=0;i< inorder.length;i++){
                valueHashMap.put(inorder[i],i);
            }
        return setTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1,valueHashMap);
        }
        //建出整个数,返回头节点,需要传入留个参数,前序的数组,以及起始,终止下标。中序的数组,以及起始终止的下标
        public static TreeNode setTree(int[] pre,int L1,int R1,int[] in ,int L2,int R2,HashMap<Integer,Integer> valueHashMap){
      if(L1>R1){
          return null;
      }
            //如果长度只有1,直接返回
            TreeNode head=new TreeNode(pre[L1]);
            if(L1==R1){
                return  head;
            }
           int find= valueHashMap.get(pre[L1]);
            head.left = setTree(pre,L1+1,L1+find-L2,in,L2,find-1,valueHashMap);
            head.right =setTree(pre,L1+find-L2+1,R1,in ,find+1,R2,valueHashMap);
            return head;
        }
}

======================================================

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
      public static TreeNode buildTree(int[] preorder, int[] inorder) {
            //边界判断
            if(preorder==null || inorder==null || preorder.length != inorder.length){
                return  null;
            }
        return setTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
        }
    
        //建出整个数,返回头节点,需要传入留个参数,前序的数组,以及起始,终止下标。中序的数组,以及起始终止的下标
        public static TreeNode setTree(int[] pre,int L1,int R1,int[] in ,int L2,int R2){
      if(L1>R1){
          return null;
      }
            //如果长度只有1,直接返回
            TreeNode head=new TreeNode(pre[L1]);
            if(L1==R1){
                return  head;
            }
        //寻找中序遍历中,头的位置
            int find = L2;
            while (in[find]!=pre[L1]){
                find++;
            }
            head.left = setTree(pre,L1+1,L1+find-L2,in,L2,find-1);
            head.right =setTree(pre,L1+find-L2+1,R1,in ,find+1,R2);
            return head;
        }

}