LeetCode--105.从前序和中序遍历序列构造二叉树(二叉树)

题目描述

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

示例 1:

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

示例 2:

复制代码
输入: preorder = [-1], inorder = [-1]
输出: [-1]

提示:

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

代码

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    Map<Integer, Integer> map = new HashMap<>();

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0) return null;
        for(int i=0; i<inorder.length; i++){
            map.put(inorder[i],i);
        }
        return buildHepler(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
    }

    public TreeNode buildHepler(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd){
        // 终止递归条件
        if(preStart > preEnd || inStart > inEnd) return null;
        // 取出先序遍历第一个 在中序遍历中找到他的位置
        TreeNode root = new TreeNode(preorder[preStart]);
        int index = map.get(preorder[preStart]);
        // 记录左边长度
        int leftLength = index - inStart;

        root.left = buildHepler(preorder, preStart + 1, preStart + leftLength, inorder, inStart, inStart + leftLength);
        root.right = buildHepler(preorder, preStart + 1 + leftLength, preEnd, inorder, index + 1, inEnd);
        return root;
    }

}
相关推荐
欣欣之王来了8 小时前
AI合规专项:AI算法透明度的合规要求
人工智能·算法
wzdark8 小时前
分块思想在算法优化中的实践与应用4
算法
Because_of_Her18 小时前
dfs-洪水填充技巧
笔记·算法·深度优先·洪水填充
小静AI工程实验室8 小时前
RSA 算法详解:从模幂原理到 OAEP 加密、PSS 签名与 Python 实验
python·算法
xzal128 小时前
GESP Python笔记
笔记·python·算法
wzdark8 小时前
算法中的记忆化思想与重复子问题优化4
算法
Discipline10298 小时前
流水线运行是否正随时间变得更加集中?
算法
lzhdim9 小时前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
weixin_307779139 小时前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab
smj2302_796826529 小时前
解决leetcode第4064题至多一次取反能被k整除的最长子数组II
python·算法·leetcode