# LeetCode-Construct Binary Tree from Preorder and Inorder Traversal
Date: 2020-07-28


### **题目：**

Given preorder and inorder traversal of a tree, construct the binary tree.

**Note:**  
You may assume that duplicates do not exist in the tree.

For example, given

```
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
```

Return the following binary tree:

```
    3
   / \
  9  20
    /  \
   15   7
```

### **实现：**

- 递归方式，根据二叉树中序遍历和前续遍历，创建二叉树。中序遍历： 左-根-右，前续遍历： 根-左-右， 所以可以通过前续遍历的第一个节点找到根节点，并生成根节点， 因为二叉树没有重复节点， 就 可以在中序遍历数据中找到根节点，再分成左右两个子树，递归执行下去，遍历完所有节点。 通过preorder获取根节点， 通过inorder生成左右子树，查找节点在中序遍历数据组里位置，java可以通过HashMap实现。 
- 不使用map情况下   时间复杂度 O(N^2)    , 使用map查找O(N)      

```
/** java
 * 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 TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> treemap = new HashMap <>();
        for (int i=0; i<inorder.length; i++){
            treemap.put(inorder[i], i);
        }
        
     
        AtomicInteger rootindex = new AtomicInteger(0); 
        return helper(preorder, inorder, 0, inorder.length -1, rootindex, treemap);
    }
    
     public TreeNode helper(int[] preorder, int[] inoder, int left, int right, AtomicInteger index, Map<Integer, Integer> treemap) {
   
        if (left > right){
            return null;
        }
        //new node, set root
        int val = preorder[index.intValue()];
        TreeNode node = new TreeNode(val);
        index 
       
        //search inorder 
        int root = treemap.get(val);
        
        //left substree
        node.left = helper(preorder, inoder, left, root-1, index, treemap);
        //right substree
        node.right = helper(preorder, inoder, root+1, right, index, treemap);
    
        return node ;
        
    }
}
```

### 参考及引用:

[techiedelight-construct-binary-tree-from-inorder-preorder-traversal](https://www.techiedelight.com/construct-binary-tree-from-inorder-preorder-traversal/)

