每天一道算法题——重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

测试用例:

[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]

对应输出应该为:

{1,2,5,3,4,6,7}

源码:

public class Test1 {
    class TreeNode {//定义二叉树类,以表示二叉树结构。
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x){val = x;}}

    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);//调用重载的reConstructBinary方法
        return root;
        }

    // 前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
    //pre[]前序遍历的数组,int[]中序遍历的数组
    //startPre代表此次前序遍历到的第一个数 endPre代表此次前序遍历到的最后一个数
    //startIn代表此次中序遍历到的第一个数 endIn代表此次中序遍历到的最后一个数
    private TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
        if (startPre > endPre || startIn > endIn)
            return null;//排除输入错误的情况
        TreeNode root = new TreeNode(pre[startPre]);//创建一个新的二叉树
        for (int i = startIn; i <= endIn; i++)
            if (in[i] == pre[startPre]) {//找到根节点
                root.left = reConstructBinaryTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);//递归调用,建立左子树
                root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);//递归调用,建立右子树
            }
        return root;
    }
}

运行时间
219ms

你可能感兴趣的:(每天一道算法题,算法练习,Java,二叉树,算法,剑指offer-java实现,递归)