import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param inorder int整型一维数组 中序遍历序列
     * @param postorder int整型一维数组 后序遍历序列
     * @return TreeNode类
     */
    /*分治重构求解。中序遍历的顺序为:左中右;后序遍历的顺序为:左右中。
    因此后续遍历序列的最后一个元素为根节点,我们找到它在中序遍历中的位置,
    就可以把中序遍历序列划分为左右两部分,分别为左右子树的中序遍历序列;
    而根据中序遍历划分出来的左右子树的元素个数,我们又可以把后序遍历序列划分为左右两个部分。
    然后两个序列的左右部分分别走相同的过程进行递归重构,构建出根节点的左子树和右子树。   
    */
    public TreeNode buildTree (int[] inorder, int[] postorder) {
        // write code here
       if(inorder.length!=postorder.length || inorder==null || postorder.length==0) return null;
        //先找到根节点
        int buildroot=postorder[postorder.length-1];
        //构造树
        TreeNode newTree=new TreeNode(buildroot);
        //寻找中序遍历中的根节点所在位置
        int index=0;
        for(int i=0;i<inorder.length;i++){
            if(inorder[i]==buildroot){
                index=i;
                break;
            }
        }
        //重构
        newTree.left=buildTree(Arrays.copyOfRange(inorder , 0 ,index) , Arrays.copyOfRange(postorder , 0 , index));
        newTree.right=buildTree(Arrays.copyOfRange(inorder , index+1 , inorder.length),Arrays.copyOfRange(postorder ,index ,inorder.length-1));
        return newTree;
    }
    
}