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

文章目录

    • 题目
    • 方法一:递归

题目

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

方法一:递归

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.hqwc.cn/news/91927.html

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

相关文章

React 18 对 state 进行保留和重置

参考文章 对 state 进行保留和重置 各个组件的 state 是各自独立的。根据组件在 UI 树中的位置&#xff0c;React 可以跟踪哪些 state 属于哪个组件。可以控制在重新渲染过程中何时对 state 进行保留和重置。 UI 树 浏览器使用许多树形结构来为 UI 建立模型。DOM 用于表示 …

k8s之存储篇---数据卷Volume

数据卷概述 Kubernetes Volume&#xff08;数据卷&#xff09;主要解决了如下两方面问题&#xff1a; 数据持久性&#xff1a;通常情况下&#xff0c;容器运行起来之后&#xff0c;写入到其文件系统的文件暂时性的。当容器崩溃后&#xff0c;kubelet 将会重启该容器&#xff…

【2】openGL shader着色器分析三角形填色

源代码在下面。文档查询 > docs.gl 结果展示&#xff1a;使用自己的shader和打印错误描述 该篇主要在上一部分代码的基础上添加了自己写的shader&#xff0c;即着色器。最常用的两个着色器 vertex shader 和 fragment shader&#xff0c;即顶点着色器和片段着色器。 大概…

ES线程池设置

一文搞懂ES中的线程池 - 知乎 ES线程池设置-阿里云开发者社区 文章目录 一、简介 二、线程池类型 2.1、fixed 2.2、scaling 2.3、direct 2.4、fixed_auto_queue_size 三、处理器设置 四、查看线程池 4.1、cat thread pool 4.2、nodes info 4.3、nodes stats 4.4、no…

pxe网络装机

目录 一、概述 二、配置 三、开启客户端验证 一、概述 &#xff08;一&#xff09;PXE是什么&#xff1f; 批量装机系统&#xff0c;网络安装linux操作系统。需要客户端的网卡支持pxe网络启动。 &#xff08;二&#xff09;PXE的组件&#xff1a; vsftpd/httpd/nfs&…

RK3562 VS RK3566 性能解析

RK3562是深圳触觉智能最新推出的一款高性能核心板及其开发套件&#xff0c;采用四核A53Mali G52架构&#xff0c;主频2GHz&#xff0c;内置1T NPU算力以及13M ISP&#xff0c;拥有丰富的外围接口。其次在解码方面&#xff0c;支持H.264 1080P60fps、H.265 4K30fps&#xff1b;编…

什么是BEM命名规范(Block-Element-Modifier Notation)?它有什么优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范&#xff08;Block-Element-Modifier Notation&#xff09;⭐ BEM命名结构⭐ 优势⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎…

Docker Harbor 私有镜像仓库的部署和管理

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 首先需要安装 Docker-Compose 服务 部署 Harbor 服务 修改配置文件 docker配置文件添加本地仓库地址 关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数 &a…

LLM本地知识库问答系统(一):使用LangChain和LlamaIndex从零构建PDF聊天机器人指南

随着大型语言模型&#xff08;LLM&#xff09;&#xff08;如ChatGPT和GPT-4&#xff09;的兴起&#xff0c;现在比以往任何时候都更容易构建比普通熊更智能的智能聊天机器人&#xff0c;并且可以浏览堆积如山的文档&#xff0c;为您的输入提供准确的响应。 在本系列中&#xf…

Spring MVC: 请求参数的获取

Spring MVC 前言通过 RequestParam 注解获取请求参数RequestParam用法 通过 ServletAPI 获取请求参数通过实体类对象获取请求参数附 前言 在 Spring MVC 介绍中&#xff0c;谈到前端控制器 DispatcherServlet 接收客户端请求&#xff0c;依据处理器映射 HandlerMapping 配置调…

2024河南光伏展|河南储能展|河南国际太阳能光伏储能展览会

2024第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会 时间&#xff1a;2024年2月26-28日 地点&#xff1a;郑州.中原国际博览中心 河南国际太阳能光伏及储能产业展览会是一个盛大的行业聚会&#xff0c;旨在展示、交流、合作和创新。这个展览会将会是一个…

Qt/C++编写视频监控系统81-Onvif报警抓图和录像并回放

一、前言 视频监控系统中的图文警情模块&#xff0c;是通过Onvif协议的事件订阅拿到的&#xff0c;通过事件订阅后&#xff0c;设备的各种报警事件比如入侵报警/遮挡报警/越界报警/开关量报警等&#xff0c;触发后都会主动往订阅者发送&#xff0c;而且一般都是会发送两次&…