【二叉树】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]

解题思路

根据给定的前序遍历和中序遍历序列构造二叉树,可以通过递归的方式来实现。

  • 1、前序遍历序列的第一个节点是根节点,在中序遍历序列中找到根节点的位置,将中序遍历序列分为左子树序列和右子树序列。
  • 2、根据左子树序列和右子树序列的长度,将前序遍历序列也分为左子树序列和右子树序列。
  • 3、分别递归构造左子树和右子树,并连接到根节点上。

Java实现

public class ConstructBinaryTree {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}public TreeNode buildTree(int[] preorder, int[] inorder) {if (preorder == null || inorder == null || preorder.length != inorder.length || preorder.length == 0) {return null;}return buildTreeHelper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);}private TreeNode buildTreeHelper(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {if (preStart > preEnd || inStart > inEnd) {return null;}// 根节点的值是先序遍历的第一个节点的值int rootValue = preorder[preStart];TreeNode root = new TreeNode(rootValue);// 在中序遍历中找到根节点的位置int rootIndexInorder = inStart;while (rootIndexInorder <= inEnd && inorder[rootIndexInorder] != rootValue) {rootIndexInorder++;}// 计算左子树的长度int leftTreeLength = rootIndexInorder - inStart;// 递归构建左右子树root.left = buildTreeHelper(preorder, preStart + 1, preStart + leftTreeLength, inorder, inStart, rootIndexInorder - 1);root.right = buildTreeHelper(preorder, preStart + leftTreeLength + 1, preEnd, inorder, rootIndexInorder + 1, inEnd);return root;}// 示例测试public static void main(String[] args) {ConstructBinaryTree solution = new ConstructBinaryTree();int[] preorder = {3, 9, 20, 15, 7};int[] inorder = {9, 3, 15, 20, 7};TreeNode root = solution.buildTree(preorder, inorder);// 可以在这里对构建的二叉树进行操作或遍历printPreTree(root);System.out.println("-----------");printInorderTree(root);}// 先序打印二叉树结构private static void printPreTree(TreeNode root) {if (root == null) {return;}System.out.println(root.val);printPreTree(root.left);printPreTree(root.right);}// 中序打印二叉树结构private static void printInorderTree(TreeNode root) {if (root == null) {return;}printInorderTree(root.left);System.out.println(root.val);printInorderTree(root.right);}
}

时间空间复杂度

  • 时间复杂度:O(n),其中n是二叉树中的节点数。
  • 空间复杂度:O(n),需要额外的空间来存储中序遍历序列的映射关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587455.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

篮球竞赛预约平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)篮球馆,篮球赛,竞赛项目,赛事预约

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

创建spring boot+Mybatis项目全流程

创建spring bootMybatis项目全流程 第一步&#xff1a;打开IDEA 【New -> Project】 第二步&#xff1a;选择Spring Initializr 第三步&#xff1a;输入Name以及相关配置&#xff0c;可以参考截图 注意&#xff1a;Server URL 出可以替换为阿里云镜像【https://start.ali…

NoSQL(非关系型数据库)之Redis的简介与安装

一、简介 1.1 关系型数据库与非关系型数据库 1.1.1 概念 1.1.2 区别 1.2 非关系型数据库产生背景 1.3 redis 简介 1.4 redis 优点 1.5 redis 快的原因 二、安装 2.1 关闭核心防护 2.2 安装相关依赖 2.3 解压软件包并进行编译安装 2.4 设置 Redis 服务所需相关配置文…

赛奥分离技术现已加入2024第13届生物发酵展

参展企业介绍 上海赛奥分离技术工程有限公司成立于2010年,是上海市高新技术企业、上海市专精特新企业&#xff0c;宝山区工程及技术中心。公司着重于在流体分离净化领域&#xff0c;研究开发制造膜技术领域中错流微滤、超滤系统、纳滤系统、反渗透、精细过滤等膜分离设备及适用…

OSPF中配置静态路由实验简述

静态路由协议和OSPF&#xff08;开放最短路径优先&#xff09;协议是两种常见的路由协议&#xff0c;它们在路由选择和网络管理方面有一些区别。他们可以共存。 静态路由协议需要手动配置路由表&#xff0c;不会自动适应网络拓扑变化&#xff0c;适用于小型网络或者网络拓扑变化…

计算机缺失mfc100u.dll如何修复,分享多种靠谱的解决方法

由于各种原因&#xff0c;电脑在使用过程中可能会出现一些问题&#xff0c;其中之一就是显示mfc100u.dll缺失的错误提示。这个问题可能会导致电脑无法正常运行某些程序或功能&#xff0c;给用户带来困扰。为了解决这个问题&#xff0c;我将分享以下五种解决方法&#xff0c;希望…

简单的弱口令密码字典!!!

将下面的复制到文本文档即可&#xff01;&#xff01;&#xff01; 弱口令密码字典一&#xff1a; %null% %username% !#$ !#$% !#$%^ !#$%^& !#$%^&* 000000 00000000 0123456789 1 101010 111 111111 1111111 11111111 1111111111 111222 112233 11223344 121212 121…

【Vue3】动态组件的使用

简言 记录下动态组件的使用。 使用场景&#xff1a;多个组件需要来回切换使用时&#xff0c;可以考虑使用动态组件。 <component> 元素 component元素一个用于渲染动态组件或元素的“元组件”。 他有一个必需的属性is,is有以下特点&#xff1a; 当 is 是字符串&#…

2024最新软件测试【测试理论+ python 编程 】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

ssm017网上花店设计+vue

网上花店的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关…

如何在Flutter应用中配置ipa Guard进行混淆

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

ChatGPT常用提示词,各行各业如何使用ChatGPT

常规交互提示词&#xff1a; 定义与解释&#xff1a; 请解释XXX术语的含义。阐述一下YYY的概念。 问答模式&#xff1a; 谁是发明了WWW的人&#xff1f;请告诉我太阳系内最大的行星是哪个&#xff1f; 创作类任务&#xff1a; 为我写一首诗&#xff0c;主题是春天的早晨。创作一…