【LeetCode-中等题】105. 从前序与中序遍历序列构造二叉树

news2024/10/4 11:25:16

文章目录

    • 题目
    • 方法一:递归

题目

在这里插入图片描述
在这里插入图片描述

方法一:递归

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
首先根据 preorder 找到根节点是 3
    
然后根据根节点将 inorder 分成左子树和右子树
左子树
inorder [9]

右子树
inorder [15,20,7]

这时候3是根节点  
3的左子树为如下
preorder[9] 

3的右子树为如下

preorder[20 15 7] 


现在我们只需要构造左子树和右子树即可,成功把大问题化成了小问题
然后重复上边的步骤继续划分,直到 preorder 空,返回 null 即可

解题的关键在与找根节点和 左子树和右子树在前序遍历数组的范围,一步步找出根节点,然后划分出左右子树,然后让根节点指向左右子树,然后又对左右子树左重复动作

这个根据前序遍历的第一个节点(根节点)去中序遍历中找左右子树的范围,可以根据前序遍历的根节点值循环去中序遍历中找,因为题目保证节点不存在重复,所以可以根据中序遍历维护一个节点和下标的哈希表,这个前序遍历的根节点,可以轻松的找到中序遍历的根节点,从而在前序遍历中确定左右子树的范围

  1. 根据中序遍历维护一个key为节点,value为下标的哈希表
  2. 根据前序遍历的第一个节点(也就是根节点)去中序遍历哈希表找根节点
  3. 再根据哈希表中找到的根节点,在中序遍历找到左子树的区间
  4. 再根据这个区间,去前序遍历找到左子树的范围,以及右子树的范围
  5. 新建根节点,指向待处理的左子树和右子树(递归)

在这里插入图片描述
在这里插入图片描述

// 方法一 : 递归+哈希(到中序遍历数组中找 根节点值  然后判断出左右子树,再根据前序构建树)
    Map<Integer,Integer> inorderMap = new  HashMap<>(); //记录中序遍历节点与数组下标的映射关系
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        //中序遍历数组下标映射map构造
        for(int i = 0 ; i<inorder.length;i++){
            inorderMap.put(inorder[i],i);
        }
        //构建树            前序数组  前序数组起始位置       前序数组末尾位置   中序数组起始位置       
        return myBuildTree(preorder,     0,               preorder.length - 1,                0        );
    }

      public TreeNode myBuildTree(int[] preorder, int prebegin , int preend,int inbegin) {
          if ( prebegin > preend) {
            return null;
        }
          int preorder_root = prebegin;  // 前序遍历中的第一个节点就是根节点
          int preindex = inorderMap.get(preorder[preorder_root]); // 在中序遍历中定位根节点

      
          TreeNode root = new TreeNode(preorder[preorder_root]);    // 先把根节点建立出来

          int size_left_subtree = preindex - 1 -inbegin; // 得到左子树中的节点数目

            // 递归地构造左子树,并连接到根节点
           // 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素

            root.left = myBuildTree(preorder,prebegin +1,prebegin+1 + size_left_subtree,inbegin);

            // 递归地构造右子树,并连接到根节点
          // 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素

            root.right = myBuildTree(preorder,prebegin+1 + size_left_subtree+1,preend,preindex+1);

          
          return root;
      }

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

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

相关文章

C++信息学奥赛1178:成绩排序

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组 arrstring brr[n]; // 创建大小为 n 的字符串数组 brrfor(int i0;i<n;i) cin>>brr[i]>>ar…

数据库设计的六个基本步骤

按照规范设计的方法&#xff0c;考虑数据库及其应用系统开发全过程&#xff0c;可将数据库设计分为以下6个阶段&#xff0c;分别为&#xff1a; 1.需求分析&#xff0c; 2.概念结构设计&#xff0c; 3.逻辑结构设计&#xff0c; 4.物理结构设计&#xff0c; 5.数据库实施&…

Ceph IO流程及数据分布

1. Ceph IO流程及数据分布 1.1 正常IO流程图 步骤&#xff1a; client 创建cluster handler。client 读取配置文件。client 连接上monitor&#xff0c;获取集群map信息。client 读写io 根据crshmap 算法请求对应的主osd数据节点。主osd数据节点同时写入另外两个副本节点数据。…

MES在人工智能方面的应用

MES&#xff08;制造执行系统&#xff09;在人工智能方面的应用主要集中在优化制造流程、提高生产效率和质量控制等方面。以下是一些MES在人工智能领域的应用案例&#xff1a; 1. 预测性维护&#xff1a;通过收集和分析生产设备的传感器数据&#xff0c;结合机器学习算法&am…

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用&#xff0c;在 windows 系统上&#xff0c;打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文&#xff0c;则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下&#xff0c;在 windows 系统打完的 mis 包…

苹果照片丢失了?三招教你快速找回珍贵照片

照片记录了我们生活中的无数美好瞬间&#xff0c;能够帮助人们重新唤起那些珍贵的记忆。平时&#xff0c;大家也喜欢通过分享照片来让家人和朋友更加了解自己的生活。 如果手机上的照片不小心误删或者莫名丢失&#xff0c;请不必过度焦虑。小编为大家整理了适合果粉恢复苹果照…

中途接手项目,项目经理何如顺利交付?

有一个新项目&#xff0c;因为项目不被公司领导看中&#xff0c;项目金额小&#xff0c;对公司没有多少价值&#xff0c;且客户要求较多&#xff0c;但是碍于客户是熟人又不得不做&#xff0c;原来的项目经理承受不住压力离职&#xff0c;公司打算将这个项目交付这个我&#xf…

Doris行权限入门实战

Doris行权限原理 Doris支持了行级数据权限&#xff0c;当多租户模式使用的是共享表模式的情况下该功能能很方便的帮用户数实现行级权限控制。 Doris的行级权限是通过安全策略(ROW POLICY)实现的。 具体做法为&#xff1a;用户在指定表上创建安全策略并授权到具体的用户&#…

word 插入 高亮代码

word 插入高亮代码&#xff1a; 方法1&#xff1a;直接复制 IDE 中的内容&#xff08;优&#xff1a;随时随地复制&#xff0c;保留vscode格式。缺&#xff1a;其他IDE的格式可能就不好看了&#xff09;方法2&#xff1a;代码复制到网站 highlightcode.com&#xff0c;高亮后再…

函数返回多个值的应用

还是通过一个编程的例子来介绍函数返回多个值的应用。 举例&#xff1a;编写一个C 函数&#xff0c;该函数在一个字符串中找到可能的最长的子字符串并打印出来&#xff0c;该字符串是由同一字符组成的。 分析&#xff1a;这个字符串是存放在字符数组里的&#xff0c;要打印出来…

开源埋雷?一文带你看清安全风险!

导读 当前&#xff0c;国际形势中不稳定、不确定和不安全因素日益突出&#xff0c;各个行业中都存在没有硝烟的战争。在信息技术领域&#xff0c;由于去年俄乌冲突爆发&#xff0c;Oracle、SAP公司宣布暂停俄罗斯所有业务&#xff0c;Github考虑限制俄开发人员访问开源代码存储…

JS三座大山 —— 原型和原型链

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、原型是什么&#xff1f;二、原型链是什么&#xff1f;2.1 原型链全方面解析2.2 为什么构造函数也有原型&#xff1f; 总结 前言 理解原型和原型链可以帮助我们更好地理解 Java…

YOLOv5:解读general.py

YOLOv5&#xff1a;解读general.py 前言前提条件相关介绍general.pyclip_boxesscale_boxes ★ \bigstar ★xywh2xyxynon_max_suppression ★ ★ ★ \bigstar\bigstar\bigstar ★★★未完待续 参考 前言 记录一下自己阅读general.py代码的一些重要点&#xff0c;方便自己查阅。…

Java基础笔试题(一)

系列文章目录 Java基础知识题(一) Java基础知识题(二) Java基础知识题(三) Java基础知识题(四) Java基础知识题(五) 文章目录 系列文章目录 模块1 单选题1 单选题2 单选题2 单选题4 单选题5 模块2 单选题1 单选题2 补充一&#xff1a;理解is-a&#xff0c;has…

【python爬虫】5.爬虫实操(歌词爬取)

文章目录 前言项目&#xff1a;寻找周杰伦分析过程代码实现重新分析过程什么是NetworkNetwork怎么用什么是XHR&#xff1f;XHR怎么请求&#xff1f;json是什么&#xff1f;json数据如何解析&#xff1f;实操&#xff1a;完成代码实现 一个总结一个复习 前言 这关让我们一起来寻…

GraphQL渗透测试案例及防御办法

什么是GraphQL GraphQL 是一种 API 查询语言&#xff0c;旨在促进客户端和服务器之间的高效通信。它使用户能够准确指定他们在响应中所需的数据&#xff0c;从而有助于避免有时使用 REST API 看到的大型响应对象和多个调用。 GraphQL 服务定义了一个合约&#xff0c;客户端可…

【Linux系列】使用虚拟机安装Linux系统

首发博客地址 首发博客地址[1] 系列文章地址[2] 下载虚拟机 请从官网下载&#xff1a; https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_player/17_0 如需不限速下载&#xff0c;请关注【程序员朱永胜】并回复 1018…

自研的外贸搜索工具

全球智能搜索 独有的VVPN技术有效绕过各种限制获取国外搜索引擎数据 1.支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户. 2.全球任意国家地区实时采集. 3.搜索引擎全网邮箱电话采集 4.社交平台一键查看采集&#xff08;Facebook,Twitter,L…

基于Matlab实现频谱分析(附上源码+数据集)

Matlab是一个功能强大的数值计算和科学计算软件&#xff0c;可以用于频谱分析。频谱分析是一种信号处理技术&#xff0c;用于将时域信号转换为频域信号&#xff0c;以便更好地理解信号的频率特性。本文将介绍使用Matlab实现频谱分析的方法。 文章目录 部分源码完整源码数据集下…

Samba服务器

目录 一、什么是Samba&#xff1f; 二、Samba进程 三、Samba主要功能 四、Samba工作流程 五、Samba安全级别 六、Sam主配置文件/etc/samba/smb.conf 七、Samba服务配置案例 一、什么是Samba&#xff1f; Samba可以让linux计算机和windows计算机之间实现文件和打印机资源共享的一…