基本思路

二叉树先序遍历序列的第一个元素必然是根元素,而根据根元素在中序遍历序列中的位置就可以将序列分为左右子树,然后再递归按照左右子树序列来构建左右子树。

基本思路是这样,但是不熟悉java的数组切片操作,所以还是看了题解,自己做的话可能就是for循环遍历中序序列,然后逐个将元素加入一个ArrayList了,这样太繁琐,而且要创建四个ArrayList,而java的Arrays.copyRangeOf方法就可以很方便的复制数组,只需要定位到中序遍历序列中根节点的位置就可以按照这个位置将先序遍历序列和中序遍历序列给分割开了。

参考

参考题解

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 preOrder int整型一维数组 
     * @param vinOrder int整型一维数组 
     * @return TreeNode类
     */
    public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        // write code here
        if (preOrder.length == 0) {
            return null;
        }

        TreeNode root = new TreeNode(preOrder[0]);
        for (int i = 0; i < vinOrder.length; ++i) {
            if (preOrder[0] == vinOrder[i]) {
                root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, i+1), Arrays.copyOfRange(vinOrder, 0, i));
                root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, i+1, preOrder.length), Arrays.copyOfRange(vinOrder, i+1, vinOrder.length));
                break;
            }
        }

        return root;
    }
}