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

题目描述

给定两个整数数组 preorderinorder ,其中 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
  • preorderinorder无重复 元素
  • 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;
    }

}
相关推荐
通信小呆呆10 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
benben04411 小时前
强化学习之DQN算法族(基于gymnasium开发)
算法
何以解忧,唯有..12 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
想吃火锅100513 小时前
【leetcode】88.合并两个有序数组js
算法
生成论实验室13 小时前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构
Qres82113 小时前
算法复键——树状数组
数据结构·算法
H1785350909613 小时前
SolidWorks第四部分_直接实体建模特征9_替换面原理
线性代数·算法·机器学习·3d建模·solidworks
dayuOK630713 小时前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
不会就选b14 小时前
算法日常・每日刷题--<二分查找>3
算法