LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal

LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (从前序与中序遍历序列构造二叉树)

题目

链接

https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

问题描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

提示

1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均 无重复 元素
inorder 均出现在 preorder
preorder 保证 为二叉树的前序遍历序列
inorder 保证 为二叉树的中序遍历序列

思路

前序是中左右,中序是左中右,起初就可以确定根节点,然后分成左右子树。

复杂度分析

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

代码

Java

    public TreeNode buildTree(int[] preorder, int[] inorder) {

        int n = preorder.length;
        if (n == 0) {
            return null;
        }
        TreeNode root = build(preorder, 0, n - 1, inorder, 0, n - 1);

        return root;
    }

    public TreeNode build(int[] pre, int ps, int pe, int[] inorder, int is, int ie) {
        if (ps > pe) {
            return null;
        }
        int rootval = pre[ps];
        int index = -1;
        for (int i = is; i <= ie; i++) {
            if (inorder[i] == rootval) {
                index = i;
                break;
            }
        }
        int size = index - is;
        TreeNode root = new TreeNode(rootval);
        root.left = build(pre, ps + 1, ps + size, inorder, is, index - 1);
        root.right = build(pre, ps + size + 1, pe, inorder, index + 1, ie);
        return root;
    }
posted @ 2022-04-09 22:41  cheng102e  阅读(38)  评论(0编辑  收藏  举报