当前位置: 首页 > news >正文

leetcode hot100【LeetCode 105.从前序与中序遍历序列构造二叉树】java实现

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]3/ \9  20/  \15   7

示例2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

Java 实现代码

class Solution {private Map<Integer, Integer> inorderIndexMap;public TreeNode buildTree(int[] preorder, int[] inorder) {inorderIndexMap = new HashMap<>();for (int i = 0; i < inorder.length; i++) {inorderIndexMap.put(inorder[i], i);}return buildSubTree(preorder, 0, preorder.length - 1, 0, inorder.length - 1);}private TreeNode buildSubTree(int[] preorder, int preStart, int preEnd, int inStart, int inEnd) {if (preStart > preEnd || inStart > inEnd) {return null;}// 根节点是前序遍历的第一个元素int rootVal = preorder[preStart];TreeNode root = new TreeNode(rootVal);// 在中序遍历中找到根节点的位置int rootIndex = inorderIndexMap.get(rootVal);int leftSubtreeSize = rootIndex - inStart;// 构造左子树root.left = buildSubTree(preorder, preStart + 1, preStart + leftSubtreeSize, inStart, rootIndex - 1);// 构造右子树root.right = buildSubTree(preorder, preStart + leftSubtreeSize + 1, preEnd, rootIndex + 1, inEnd);return root;}
}

解题思路

  1. 前序遍历的性质:

    • 前序遍历的第一个元素为当前二叉树的根节点。
  2. 中序遍历的性质:

    • 根节点将中序遍历序列划分为左子树和右子树。
    • 根节点左侧部分是左子树的中序遍历,右侧部分是右子树的中序遍历。
  3. 构造过程:

    • 从前序遍历中提取根节点。
    • 在中序遍历中找到根节点,确定左右子树的边界。
    • 递归地构造左右子树。

复杂度分析

  • 时间复杂度: 每个节点在构造过程中都只会访问一次,同时使用了哈希表快速查找中序遍历中节点的索引。

    • 构造树的时间复杂度为 O(n),其中 n 是节点数。
    • 构造哈希表的时间复杂度为 O(n)
  • 空间复杂度:

    • 递归调用的空间复杂度为 O(h),其中 h 是树的高度,最坏情况下为 O(n),平均情况下为 O(log n)
    • 哈希表的空间复杂度为 O(n)。因此,总的空间复杂度为 O(n)

http://www.mrgr.cn/news/75249.html

相关文章:

  • 使用 Keras 训练一个循环神经网络(RNN)
  • Spring框架之责任链模式 (Chain of Responsibility Pattern)
  • Python →爬虫实践
  • 重学 Android 自定义 View 系列(六):环形进度条
  • Linux软件包管理与Vim编辑器使用指南
  • Swagger enum 最佳实践:深度剖析与应用指南
  • Web性能优化:从基础到高级
  • 二叉树的遍历(手动)
  • 一文了解Android的核心系统服务
  • 不宽的宽字符
  • 面试中如何回答“怎样实现 RPC 框架”的问题?
  • 高效的 JSON 处理库 json.cpp
  • ubuntu里面的gcc编译方法
  • 三维测量与建模笔记 - 特征提取与匹配 - 4.2 梯度算子、Canny边缘检测、霍夫变换直线检测
  • 使用SimpleDateFormat的踩坑指南
  • 如何让 ChatGPT 像人类一样书写:4个步骤让你的内容栩栩如生!
  • 探索Google Earth Engine:利用MODIS数据和R语言进行2000-2021年遥感生态指数(RSEI)的时空趋势分析
  • otter 自由门使用方法
  • OpenGL 进阶系列08 - 天空盒实现
  • python习题练习
  • 【STM32外设系列】NRF24L01无线收发模块
  • 代码随想录算法训练营第45天 | 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • python os.path.join 详解
  • mysql锁机制详解
  • 刀客doc:《再见爱人4》能带动芒果TV的广告营收吗?
  • 【学习日记】notebook添加JAVA支持