描述:
给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

思路:
这道题考察的是二叉树根据先序、中序来重建二叉树的知识,这是数据结构二叉树部分的基础考点,清楚这个推导过程是先决条件。
1.递归(思想明确,代码简单)
想要重建一棵二叉树,得知道这棵树的先序和中序遍历序列,或者是中序和后序遍历序列,这是数据结构的基础知识。得知先序和中序,推导原二叉树,具体解题分为下面几步:
①先序遍历序列第一个节点一定为根节点;
②在中序遍历序列中找到这个根节点的位置;
③这个节点把中序序列分成了左右两部分,对应二叉树的左右子树,把这个子数组用java的库函数建立对应的子树;
④直到子树的序列长度为0,递归结束
代码实现:
public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        //1.递归
        if (preOrder.length == 0 || vinOrder.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;
}


















