这个题的思路是和根据中前遍历重建二叉树类似的。因为后续遍历的最后一个元素总是根节点,那么只需要先找到后序遍历中的根节点,再把数组分为左右两个区间就能找到左子树与右子树。

public class Solution {
    public TreeNode buildTree (int[] inorder, int[] postorder) {
        if(postorder.length==0)return null;
        TreeNode root = new TreeNode(postorder[postorder.length-1]);
        for(int i=0;i<inorder.length;++i){
            if(root.val==inorder[i]){
                root.left = buildTree(
                    Arrays.copyOfRange(inorder,0,i),
                    Arrays.copyOfRange(postorder,0,i)
                ); 
                root.right = buildTree(
                    Arrays.copyOfRange(inorder,i+1,inorder.length),
                    Arrays.copyOfRange(postorder,i,inorder.length-1)
                );
                return root;
            }
        }
        return root;
    }
}