# 0105. Construct Binary Tree from Preorder and Inorder Traversal ###### tags: `Leetcode` `Medium` `Recursion` `Tree` `Preorder Traversal` `Inorder Traversal` Link: https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/ ## 思路 [思路参考](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solutions/1102530/construct-binary-tree-from-preorder-and-inorder-traversal/?orderBy=most_votes) 如果锁定了一个root val就可以通过inorder array找到left subtree和right subtree都有哪些值 那么如何找到root val 对于一个postorder array来说 它的第一个值就是当前tree的root 这时我们找到了root 并且找到了left 和 right subtree都有哪些值 那么我们如何找到left 和right subtree的root呢? 由于是preorder我们从前往后遍历的时候会遇到left subtree的root 把left subtree的所有element走完才是right subtree的root 因此我们需要先把left subtree建完 才能建right subtree (这样才能保证我们可以按照postorder从前往后的顺序给定当前root的值) 所以我们用recursion先建left subtree再建right subtree ## Code ```java= class Solution { int preOrderIdx = 0; public TreeNode buildTree(int[] preorder, int[] inorder) { Map<Integer, Integer> inorderMap = new HashMap<>(); for(int i=0; i<inorder.length; i++){ inorderMap.put(inorder[i], i); } return arrayToTree(inorderMap, preorder, 0, inorder.length-1); } public TreeNode arrayToTree(Map<Integer, Integer> inorderMap, int[] preorder, int left, int right){ if(left>right) return null; TreeNode root = new TreeNode(preorder[preOrderIdx++]); root.left = arrayToTree(inorderMap, preorder, left, inorderMap.get(root.val)-1); root.right = arrayToTree(inorderMap, preorder, inorderMap.get(root.val)+1, right); return root; } } ``` ```python= class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: preorderIdx = 0 inorderDict = {} for i, val in enumerate(inorder): inorderDict[val] = i def arrayToTree(left: int, right: int) -> Optional[TreeNode]: nonlocal preorderIdx if left>right: return None root = TreeNode(preorder[preorderIdx]) preorderIdx += 1 root.left = arrayToTree(left, inorderDict[root.val]-1) root.right = arrayToTree(inorderDict[root.val]+1, right) return root return arrayToTree(0, len(inorder)-1) ```