思路:先根据先序序列的第一个节点建立根节点,然后在中序节点找到这个节点,从而划分出根节点的左、右子树的中序序列。接下来再在先序序列中确定左右子树的先序序列,并由左子树的先序序列与中序序列继续递归建立左右子树。

/**
 * 前序遍历的第一个节点是根节点,在中序遍历中找到这个节点。
 * 中序遍历中这个节点左边的是左子树,右边是右子树。
 * 然后递归去构建左右子树。
 */
public class ReConstructBinaryTree {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root = construct(pre,in,0,pre.length-1,0,in.length-1);
        return  root;
    }

    private TreeNode construct(int[] pre, int[] in, int i, int j, int k, int h) {
        int m = k;
        TreeNode root = new TreeNode(pre[i]);
        while (pre[i] != in[m]) {
            m++;
        }
        if(m == k){
            // 没有左子树时,
            root.left = null;
        } else {
            root.left = construct(pre,in,i+1,i+m-k,k,m-1);
        }
        if(m == h) {
            root.right = null;

        } else {
            root.right = construct(pre,in,i+m-k+1,j,m+1,h);
        }
        return root;

    }
}