Java——重建二叉树

news2025/1/19 23:06:36

题目链接

重建二叉树

题目描述

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
在这里插入图片描述

题目示例

示例1

输入:
[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]

返回值:
{1,2,3,4,#,5,6,#,7,#,#,8}

说明:
返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示

示例2

输入:
[1],[1]

返回值:
{1}

示例3

输入:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]

返回值:
{1,2,5,3,4,6,7}

题目提示

  1. vin.length == pre.length
  2. pre 和 vin 均无重复元素
  3. vin出现的元素均出现在 pre里
  4. 只需要返回根结点,系统会自动输出整颗树做答案对比

数据范围:n≤2000,节点的值 −10000≤val≤10000

要求:空间复杂度 O(n),时间复杂度 O(n)

解题思路

通过前序遍历的第一个值,我们可以找到二叉树的根节点所对应的值,遍历中序遍历,找到这个值,左面的所有值就是这个节点的左子树,右面的所有值就是这个节点的右子树
在这里插入图片描述
根据位于1左侧的节点个数,可以得到1节点的左子树有3个节点,根据位于1右侧的节点个数,可以得到1节点的右子树有4个节点,我们分别将这两个个数在前序遍历中标出,可以得到两段新的前序遍历和中序遍历的片段,根据这两个片段就可以继续向下构建二叉树
在这里插入图片描述
因此,我们只需要递归调用这个构造重建二叉树函数,即可构造出二叉树,其中要给出的参数分别有:

  1. 前序遍历数组
  2. 前序遍历起始位置
  3. 前序遍历终止位置
  4. 后序遍历数组
  5. 后序遍历起始位置
  6. 后序遍历终止位置
    返回值为构造好的函数,终止条件是前序遍历的起始位置超过终止位置,或者后续遍历的起始位置超过终止位置

完整代码

import java.util.*;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
        if(pre.length == 0 || vin.length == 0 || pre.length != vin.length){
            return null;
        }
        int preStart = 0;
        int preEnd = pre.length - 1;
        int vinStart = 0;
        int vinEnd = vin.length - 1;
        return reConstructBinaryTreeHelper(pre, preStart, preEnd, vin, vinStart, vinEnd); 
    }

    private TreeNode reConstructBinaryTreeHelper(int[] pre, int preStart, int preEnd, int[] vin, int vinStart, int vinEnd) {
        if(preStart > preEnd || vinStart > vinEnd){
            return null;
        }
        TreeNode root = new TreeNode(pre[preStart]);
        for (int i = vinStart; i <= vinEnd; i++){
            if(vin[i] == pre[preStart]){
                root.left = reConstructBinaryTreeHelper(pre, preStart + 1, preStart + 1 + i - vinStart - 1, vin, vinStart, i - 1);
                root.right = reConstructBinaryTreeHelper(pre, preStart + i - vinStart + 1, preEnd, vin, i + 1, vinEnd);
                break;
            }
        }
        return root;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(驱动基础篇)V4L2 用户空间 API 说明

🚀返回专栏总目录 文章目录 一、V4L2 用户空间 API二、打开视频设备三、查询设备功能沉淀、分享、成长,让自己和他人都能有所收获!😄 📢设备驱动的主要目的是控制和利用底层硬件,同时向用户展示功能。 这些用户可以是在用户空间或其他内核驱动中运行的应用。 本篇我们…

KIOPTRIX: LEVEL 5通关详解

环境配置 虚拟机网络适配器删了重新上一个就行 信息收集 漏洞发现 两个端口的web页面都没有显著的特征,尝试扫描路径,也没有扫到有价值的信息 8080端口访问被拒绝 在80端口的web页面源码中发现信息 访问 注意到title是pChart 尝试利用 可以知道有目录穿越和xss 我们可以尝…

Java实现根据利润提成发放的奖金,求1感叹号+2感叹号+……+20的和这两个程序的代码

目录 前言 一、根据利润提成发放的奖金 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、求1!2!3!……20的和 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 前言 1.因多重原因&#xff0c;本博文有两个代码程序组成&#xff…

游戏工厂:AIGC/ChatGPT与流程式游戏开发(码客 卢益贵)

关键词&#xff1a;AI&#xff08;AIGC、ChatGPT、文心一言&#xff09;、流程式管理、好莱坞电影流程、电影工厂、游戏工厂、游戏开发流程、游戏架构、模块化开发 一、前言 开发周期长、人工成本高、成功率低等是游戏公司融资困难的罪因。所以有的公司凭一个爆款游戏一骑绝尘…

比GPT-4 Office还炸裂,阿里版GPT全家桶来袭

疯狂3月的那一天&#xff0c;一切还历历在目。 微软突然在发布会上放出大招&#xff0c;用Microsoft 365 Copilot掀起了办公软件革命。 而今天&#xff0c;阿里也放出一枚重磅炸弹——阿里版的Copilot也要来了&#xff01; 并且比微软更彻底的是&#xff0c;阿里全系产品也都…

“我用 ChatGPT 造了一个零日漏洞,成功逃脱了 69 家安全机构的检测!”

一周以前&#xff0c;图灵奖得主 Yoshua Bengio、伯克利计算机科学教授 Stuart Russell、特斯拉 CEO 埃隆马斯克、苹果联合创始人 Steve Wozniak 等在内的数千名 AI 学者、企业家联名发起一则公开信&#xff0c;建议全球 AI 实验室立即停止训练比 GPT-4 更强大的模型&#xff0…

Python高级编程 type、object、class的区别 python中常见的内置类型 魔法函数

python中一切皆对象 代码块&#xff1a; a 1 print(type(a)) print(type(int))控制台输出&#xff1a; <class int> <class type>也就是说在python中int类是由type类生成的&#xff0c;而数字1是由int类生成的。 代码块&#xff1a; b "abc" prin…

SHELL函数可课后作业

一、题目 1、编写函数&#xff0c;实现打印绿色OK和红色FAILED 判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数&#xff0c;返回最…

Window中,Visual Studio 2022(C++)环境下安装OpenCV教程(不用Cmake版本)

Window中&#xff0c;Visual Studio 2022(C)环境下安装OpenCV教程 本教程主要为了方便小白安装C版本的OpenCV。 1. 第一步&#xff1a;下载官方OpenCV 下载后&#xff0c;在本地安装即可&#xff0c;注意记住安装路径&#xff0c;后续需要&#xff01; 2. 配置系统环境变量…

人口普查数据集独热编码转换

人口普查数据集独热编码转换 描述 在机器学习中&#xff0c;数据的表示方式对于模型算法的性能影响很大&#xff0c;寻找数据最佳表示的过程被称为“特征工程”&#xff0c;在实际应用中许多特征并非连续的数值&#xff0c;比如国籍、学历、性别、肤色等&#xff0c;这些特征…

中国版ChatGPT来了!快跟我一起申请文心一言吧

随着ChatGPT的快速进化吸引了全球网友的眼球 国内厂商也纷纷推出了相似的产品 其中百度推出的“文心一言”已经正式开始的相关的测试 很多人都在问 文心一言入口在哪&#xff1f; 文心一言邀请码在哪可以领&#xff1f; 文心一言怎么申请内测&#xff1f; 自从文心一言发…

手把手教你搭建自己本地的ChatGLM

前言 如果能够本地自己搭建一个ChatGPT的话&#xff0c;训练一个属于自己知识库体系的人工智能AI对话系统&#xff0c;那么能够高效的处理应对所属领域的专业知识&#xff0c;甚至加入职业思维的意识&#xff0c;训练出能够结合行业领域知识高效产出的AI。这必定是十分高效的生…

ChatGPT本地部署(支持中英文,超级好用)!

今天用了一个超级好用的Chatgpt模型——ChatGLM&#xff0c;可以很方便的本地部署&#xff0c;而且效果嘎嘎好&#xff0c;经测试&#xff0c;效果基本可以平替内测版的文心一言。 目录 一、什么是ChatGLM&#xff1f; 二、本地部署 2.1 模型下载 2.2 模型部署 2.3 模型运…

HCIE 第一天防火墙笔记整理

一、结合以下问题对当天内容进行总结 1. 什么是防火墙&#xff1f; 2. 状态防火墙工作原理&#xff1f; 二、复现上课俩个演示实验 一、结合以下问题对当天内容进行总结 1 什么是防火墙&#xff1f; 防火墙是一种隔离&#xff08;非授权用户和授权用户之间部署&#xff09;并过…

大数据学习完可以做什么

如果要推荐一种人人都能掌握的编程语言&#xff0c;应该没有比Python更合适的了。如果想学习大数据&#xff0c;可以选择从python语言入手~ Python 简单易学&#xff0c;用途广泛&#xff0c;不仅可以在日常办公中提高大家的职场效率&#xff0c;还能被大型互联网企业应用于后…

C++-c语言词法分析器

一、运行截图 对于 Test.c 的词法分析结果 对于词法分析器本身的源代码的分析结果 二、主要功能 经过不断的修正和测试代码&#xff0c;分析测试结果&#xff0c;该词法分析器主要实现了以下功能&#xff1a; 1. 识别关键字 实验要求&#xff1a;if else while do for main…

常见排序算法

目录 一、插入排序 1、直接插入排序 2、希尔排序(缩小增量插入排序&#xff09; 二、选择排序 三、堆排序 四、冒泡排序 五、快速排序&#xff08;递归&#xff09; 1、交换法 2、挖坑法 3、前后指针法&#xff08;推荐&#xff09; 4、快排再优化 六、快速排序&…

spring常用注解(全)

一、前言 Spring的一个核心功能是IOC&#xff0c;就是将Bean初始化加载到容器中&#xff0c;Bean是如何加载到容器的&#xff0c;可以使用Spring注解方式或者Spring XML配置方式。 Spring注解方式减少了配置文件内容&#xff0c;更加便于管理&#xff0c;并且使用注解可以大大…

Vue学习笔记(6. 组件之间传值)

1. 组件基本语法 (1) template (2) script (3) style 2. 父组件传值&#xff0c;子组件接值 (1) 父组件传值给子组件 (2) 子组件接收父组件的传值&#xff08;随时接收&#xff09; 子组件的值会随着父组件值的变更而变更。但是子组件变更&#xff0c;不会影响父组件的数据…

Jetson nano部署剪枝YOLOv8

目录前言一、YOLOv8模型剪枝训练1. Pretrain[option]1.1 项目的克隆1.2 数据集1.3 训练2. Constraint training3. Prune4. finetune二、YOLOv8模型剪枝部署1. 源码下载2. 环境配置2.1 trtexec环境变量设置3. ONNX导出3.1 Transpose节点的添加3.2 Resize节点解析的问题4. 运行4.…