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

来源:互联网 发布:无人机模拟器软件 编辑:程序博客网 时间:2024/05/22 03:25

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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

原创粉丝点击