中序遍历:左根右;后序遍历:左右根

从后序遍历中拿出根节点,去中序遍历中分割数组,然后根据中序左右子树数目分割后序

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类
     */
    
    Map<Integer, Integer> map;
    public TreeNode buildTree (int[] inorder, int[] postorder) {
        // write code here
        map = new HashMap<>();
        for (int i = 0; i < inorder.length; ++i) {
            map.put(inorder[i], i);
        }
        TreeNode root = split(inorder, 0, inorder.length, postorder, 0, postorder.length);
        return root;
    }

    private TreeNode split(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {
        
        if (inStart >= inEnd || postStart >= postEnd) {
            return null;
        }

        int rootVal = postorder[postEnd - 1];
        // int rootIndex = getIndex(inorder, rootVal);
        int rootIndex = map.get(rootVal);
        // 左子树长度
        int leftLength = rootIndex - inStart;
        TreeNode root = new TreeNode(rootVal);
        // 拆分左子树,包前不包后
        root.left = split(inorder, inStart, rootIndex, postorder, postStart, postStart + leftLength);
        // 拆分右子树,同上
        root.right = split(inorder, rootIndex + 1, inEnd, postorder, postStart + leftLength, postEnd - 1);
        return root;
    }

    /*private int getIndex(int[] order, int val) {
        int index = 0;
        for (int i = 0; i < order.length; ++i) {
            if (order[i] == val) {
                index = i;
                break;
            }
        }
        return index;
    }*/

}