import java.util.*;
public class Solution {

    public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        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]) {
            //Arrays.copyOfRange中的第一个下标是包含的,第二个下标不包含所以加一
                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;
    }
}

方法:二叉树递归

由于前序遍历是从根开始的,所以每个节点都是后面子树的根,在中序遍历中总能找到该根节点,相应的该节点的左边为左子树、右边为右子树。前序遍历的第二个节点便是中序遍历左子树的根,依次类推通过递归可以建立一个二叉树。

1、空数组返回空树

2、建立一个新结点,在中序遍历的数组中找到前序的第一个节点,新结点的左右指针指向递归的返回节点,递归的参数是截取的原先序数组中属于左子树的部分,和原中序数组中属于左子树的部分,同理右子树也一样。

3、递归结束后跳出循环,返回新结点。

知识点:Arrays中的copyOfRange方法

作用是赋值一个左闭右开的数组,即第二个下标不包含。