1. class Solution {
    2. int postIndex;
    3. int[] inOrder;
    4. int[] postOrder;
    5. Map<Integer, Integer> map = new HashMap<>();
    6. public TreeNode buildTree(int[] inorder, int[] postorder) {
    7. this.inOrder = inorder;
    8. this.postOrder = postorder;
    9. postIndex = postorder.length - 1;
    10. int idx = 0;
    11. //建立(元素,下标)键值对的哈希表
    12. for (int val : inorder) {
    13. map.put(val, idx++);
    14. }
    15. return helper(0, postorder.length - 1);
    16. }
    17. public TreeNode helper(int left, int right) {
    18. if (left>right){
    19. return null;
    20. }
    21. int rootVal = postOrder[postIndex--];
    22. TreeNode root = new TreeNode(rootVal);
    23. // 根据root所在的位置分成左右子树
    24. int index = map.get(rootVal);
    25. // 先执行右节点,与上面“postOrder[postIndex--]”匹配
    26. // 之前不理解,现在这样得到上面的root之后先递归执行右子节点,就解释上面的“postOrder[postIndex--]”
    27. root.right = helper(index+1,right);
    28. root.left = helper(left,index-1);
    29. return root;
    30. }
    31. }