剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树

题目

链接

https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/

问题描述

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

提示

0 - 5000

思路

算是递归思想,前序遍历的第一个数肯定是根节点,只要找到中序遍历中的该点,那么这个范围之内的全都是左子树,右侧的全是右子树,反复递归即可。

复杂度分析

时间复杂度 O(n)
空间复杂度 O(n)

代码

Java

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }


    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder.length == 0 || inorder.length == 0) {
            return null;
        }
        TreeNode root = new TreeNode(preorder[0]);
        for (int i = 0; i < inorder.length; i++) {
            if (inorder[i] == preorder[0]) {
                root.left = buildTree(
                        Arrays.copyOfRange(preorder, 1, i + 1),
                        Arrays.copyOfRange(inorder, 0, i));
                root.right = buildTree(
                        Arrays.copyOfRange(preorder, i + 1, preorder.length),
                        Arrays.copyOfRange(inorder, i + 1, inorder.length));
            }
        }
        return root;
    }
posted @ 2020-02-26 15:02  cheng102e  阅读(95)  评论(0编辑  收藏  举报