leetcode105:从前序与中序遍历构建二叉树

embedded/2024/11/23 8:08:25/

给定两个整数数组 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 保证 为二叉树的中序遍历序列

步骤1:定义问题和条件

题目计算问题性质

给定二叉树的 先序遍历preorder)和 中序遍历inorder),构造该二叉树并返回其根节点。

  • 先序遍历特点:遍历顺序是根节点 -> 左子树 -> 右子树。
  • 中序遍历特点:遍历顺序是左子树 -> 根节点 -> 右子树。
输入输出条件
  • 输入:
    • preorder: 二叉树的先序遍历结果数组。
    • inorder: 二叉树的中序遍历结果数组。
  • 输出:
    • 构造出的二叉树的根节点。
限制条件
  1. 两个数组长度相等,且 1 <= preorder.length == inorder.length <= 3000
  2. 数组中没有重复元素。
  3. inorder 数组中的所有元素都能在 preorder 中找到。
  4. 保证给定的遍历结果能构成唯一的二叉树。
边界条件
  1. 数组只有一个元素时,直接返回单节点的树。
  2. 数组为空时,返回空树。

步骤2:解题思路与算法设计

最佳算法设计:分治法

利用先序和中序遍历的特点,可以通过递归实现二叉树的构造。

  1. 核心逻辑

    • 先序遍历的第一个元素一定是当前树的根节点。
    • 在中序遍历中找到该根节点的位置,该位置将中序数组分为两部分:
      • 左部分为根节点的左子树的中序遍历。
      • 右部分为根节点的右子树的中序遍历。
    • 递归地对上述左右部分继续执行分治构造。
  2. 步骤详解

    • preorder 数组中取根节点。
    • inorder 中找到该根节点的索引,划分出左子树和右子树的元素。
    • 根据划分出的中序结果计算出左右子树在先序数组中的范围。
    • 递归构造左右子树,直到范围为空。
  3. 时间复杂度

    • 每次递归需在线性时间内找到根节点在 inorder 中的位置,优化后为 $O(1)$(使用哈希表)。
    • 整体时间复杂度为 $O(n)$。
  4. 空间复杂度

    • 递归栈的深度为树的高度,最坏情况下(单链树)空间复杂度为 $O(n)$。

步骤3:实现代码

步骤4:优化和启发

算法优化点
  • 哈希表加速查找:通过哈希表记录中序数组中每个值的索引,从 $O(n)$ 优化为 $O(1)$。
  • 递归分治思想:利用遍历的分区特点递归构造,避免额外的数据结构存储。
启发
  • 分治法适合解决问题规模大、递归特性明显的问题。
  • 通过提前构建哈希表优化重复查找,是降低算法时间复杂度的重要思路。

步骤5:实际应用场景

应用场景
  • 数据结构恢复:从线性序列中重建树形结构,在数据库索引或图形数据中应用广泛。
  • 二叉树传输:用于二叉树的序列化和反序列化(如二叉搜索树)。
案例分析
  • 网络通信中的 XML/JSON 树还原
    • 在实际中,XML/JSON 数据可以表示为树结构。
    • 通过序列化传输(生成先序和中序遍历结果),接收端通过算法构造原始树结构。
    • 优化后的算法可显著提高大规模数据传输中的效率。

http://www.ppmy.cn/embedded/139808.html

相关文章

『Linux』 第四章 进程—— 进程状态讲解

目录 1.1.1 通过系统调用创建进程-fork初识 1.2 进程状态 1.2.1 Linux内核源代码怎么说 1.2.2 进程状态查看 1.2.3 Z(zombie)-僵尸进程 1.2.4 僵尸进程危害 1.2.5 孤儿进程 1.3 进程优先级 1.3.1 基本概念 1.3.2 查看系统进程 1.3.3 PRI and NI 1.3.4 PRI vs NI …

【LeetCode面试150】——1两数之和

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

十七:Web内容协商与资源表述

在现代Web架构中,随着用户设备、语言和网络环境的多样化,如何高效地传递和获取适合的内容变得尤为重要。Web内容协商(Content Negotiation)和资源表述(Representation of Resources)是解决这一问题的重要技术手段。它们帮助服务器根据客户端的需求动态提供最合适的资源,…

Cesium教程03_加载b3dm高度

使用 Vue3 和 Cesium 构建三维地球场景并实现高度调整功能 引言 在现代 Web GIS&#xff08;地理信息系统&#xff09;开发中&#xff0c;Cesium 是一款功能强大的三维地球可视化工具。本文展示了如何使用 Vue3 与 Cesium 集成&#xff0c;实现一个支持调整高度功能的三维地球…

力扣刷题--21.合并两个有序链表

I am the best &#xff01;&#xff01;&#xff01; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2…

音频档案批量拷贝:专业SD拷贝机解决方案

批量音频档案拷贝最佳方案&#xff1a;解决播放错误与拷贝不完全问题 在现今数字化生产需求越来越高的时代&#xff0c;专业的拷贝机为大量数据复制提供了高效、安全的解决方案&#xff0c;特别是在批量拷贝音频档案至MicroSD卡并应用于播放器时&#xff0c;拷贝机具有无与伦比…

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 什么是深度学习&#xff1f; 人工智能、机器学习与…

【Python TensorFlow】进阶指南(续篇三)

在前几篇文章中&#xff0c;我们探讨了TensorFlow的高级功能&#xff0c;包括模型优化、分布式训练、模型解释等多个方面。本文将进一步深入探讨一些更具体和实用的主题&#xff0c;如模型持续优化的具体方法、异步训练的实际应用、在线学习的实现细节、模型服务化的最佳实践、…