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