前序遍历:{1,2,4,7,3,5,6,8}

中序遍历:{4,7,2,1,5,3,8,6}

根据前序遍历第一个元素“1”,可以将中序遍历分成左右子树,左子树{4,7,2},右子树{5,3,8,6}。

接着,根据前序遍历第二个元素“2”,将“1”的左子树{4,7,2}分为左子树{4,7},右子树{}。

再根据前序遍历第三个元素“4”,将“2”的左子树{4,7}分为左子树{},右子树{7}。

前序遍历第三个元素“7”,将“4”的右子树{7}分为左子树{},右子树{}。

以此类推,通过递归的方式可以很容易重建二叉树。

public class BinaryTree {
    /**
     * 根据中序遍历和前序遍历重建二叉树
     * @param inOrderArray 中序遍历数组
     * @param start 中序遍历起点下标
     * @param end 中序遍历终点下标
     * @param list 前序遍历链表
     * @return 返回二叉树
     */
    public static TreeNode createTree(int[] inOrderArray, int start, int end, LinkedList<Integer> list){
        //返回前序遍历链表的首结点,即为子树的根结点
        int item = list.removeFirst();
        TreeNode node = new TreeNode(item);
        //获取根结点在中序遍历数组中的位置下标
        int index = getRootIndex(inOrderArray,item,start,end);
        //递归构建左子树
        //start == index表示该结点没有左子树
        if (start == index){
            node.setLeft(null);
        }else {
            node.setLeft(createTree(inOrderArray,start,index-1,list));
        }

        //递归构建右子树
        //index == end表示该结点没有右子树
        if (index == end){
            node.setRight(null);
        }else {
            node.setRight(createTree(inOrderArray,index+1,end,list));
        }
        return node;
    }

    /**
     * 获取根节点值在中序遍历中的下标
     * @param inOrderArray 中序遍历数组
     * @param item 根结点的值
     * @param start 中序遍历起点下标
     * @param end 中序遍历终点下标
     * @return 返回根节点值在中序遍历中的下标
     */
    private static int getRootIndex(int[] inOrderArray,int item,int start,int end){
        for (int i = start;i<=end;i++){
            if (inOrderArray[i] == item){
                return i;
            }
        }
        return -1;
    }

    /**
     * 前序遍历输入二叉树
     */
    private static void preOrderTraveral(TreeNode node){
        if (node == null){
            return;
        }
        System.out.print(node.getItem() + " ");
        preOrderTraveral(node.getLeft());
        preOrderTraveral(node.getRight());
    }

    private static void inOrderTraveral(TreeNode node){
        if (node == null){
            return;
        }
        inOrderTraveral(node.getLeft());
        System.out.print(node.getItem() + " ");
        inOrderTraveral(node.getRight());
    }

    public static void main(String[] args) {
        int[] a = {4,7,2,1,5,3,8,6};
        LinkedList<Integer> list = new LinkedList<>(Arrays.asList(new Integer[]{1,2,4,7,3,5,6,8}));
        TreeNode node = createTree(a,0,a.length-1,list);
        preOrderTraveral(node);
        System.out.println();
        inOrderTraveral(node);
        System.out.println();
        
        int[] c = {2};
        LinkedList<Integer> list3= new LinkedList<>(Arrays.asList(new Integer[]{2}));
        TreeNode node3 = createTree(c,0,c.length-1,list3);
        preOrderTraveral(node3);
        System.out.println();

        int[] d = {5,4,3,2};
        LinkedList<Integer> list4 = new LinkedList<>(Arrays.asList(new Integer[]{2,3,4,5}));
        TreeNode node4 = createTree(d,0,d.length-1,list4);
        preOrderTraveral(node4);
    }
    /*
     * 1 2 4 7 3 5 6 8
     * 4 7 2 1 5 3 8 6
     * 
     * 2
     * 
     * 2 3 4 5
     */
}
public class TreeNode {
    private  int item;
    private TreeNode left;
    private TreeNode right;
//getter和setter
}