当前位置: 首页 > news >正文

[Leetcode 105][Medium] 从前序与中序遍历序列构造二叉树-递归

目录

一、题目描述

二、整体思路

三、代码


一、题目描述

题目地址

二、整体思路

        前序遍历得到的是[根结点|左子树|右子树],中序遍历得到的是[左子树|根结点|右子树]

那么可以设立一个递归函数,作用是利用前序遍历的数组和中序遍历的数组构建一个节点的二叉树

        参数为(前序遍历数组、中序遍历数组、前序遍历数组的左边界、前序遍历数组的右边界、中序遍历数组的左边界、中序遍历数组的右边界)

        问题的关键是要找到根节点,每一次调用递归函数时,前序遍历数组的左边界为根节点的索引,然后我们要设法找到根节点在中序遍历数组的索引。因此,一开始可以先用哈希表保存根节点在中序遍历数组的索引。

        根节点在Preorder中索引永远为l1,在Inorder索引i可以通过哈希表得到

        Inorder中[l2,i-1]的元素就是左子树的元素,在Preorder中表现为[l1+1,l1+i-l2]

        同理,Inorder中[i+1,r2]的元素就是右子树的元素,在Preorder中表现为[l1+i-l2+1,r1](l1+i-l2为左子树元素,+1就是右子树第一个元素)

        综上,Preorder中根节点索引为l1,左子树元素区间为[l1+1,l1+i-l2],右子树区间为[l1+i-l2+1,r1]

Inorder中根节点索引为i,左子树元素区间为[l2,i-1],右子树区间为[i+1,r2]

三、代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {Map<Integer,Integer> map=new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==1 && inorder.length==1){return new TreeNode(preorder[0]);}for(int i=0;i<inorder.length;i++){map.put(inorder[i],i);}TreeNode root=build(preorder,inorder,0,preorder.length-1,0,inorder.length-1);return root;}public TreeNode build(int[] preorder,int[] inorder,int l1,int r1,int l2,int r2){if(l1>r1 || l2>r2){return null;}TreeNode node=new TreeNode(preorder[l1]);int newl1=map.get(preorder[l1]);node.left=build(preorder,inorder,l1+1,l1+newl1-l2,l2,newl1-1);node.right=build(preorder,inorder,l1+newl1-l2+1,r1,newl1+1,r2);return node;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 接口如何设计
  • 2-76 基于matlab的加权平均融合算法
  • sheng的学习笔记-AI-半监督学习
  • Kubernetes中的Kube-proxy:服务发现与负载均衡的基石
  • Java—双列集合
  • 数据库管理-第234期 2024DTCC,一场数据库盛宴(20240826)
  • debian12 - systemctl 根据状态值判断服务启动成功的依据
  • 机器学习第五十三周周报 MAG
  • 云手机解决了TikTok哪些账号运营难题?
  • 将标准输入stdin转换成命令行参数——Unix中的xargs指令
  • 手机快充头哪个牌子好?倍思65W伸缩线充电器交出优秀答卷
  • SQL注入-SQL注入基础-SQL注入流程
  • uniapp 向左滑动进入下一题,向右滑动进入上一题功能实现
  • 告警中心消息转发系统PrometheusAlert
  • 如何使用Python自动化测试工具Selenium进行网页自动化?
  • angular组件开发
  • CentOS7 安装JDK
  • css布局,左右固定中间自适应实现
  • Hibernate【inverse和cascade属性】知识要点
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java第三方包学习之lombok
  • js中forEach回调同异步问题
  • Linux下的乱码问题
  • MySQL用户中的%到底包不包括localhost?
  • vue--为什么data属性必须是一个函数
  • 从零开始在ubuntu上搭建node开发环境
  • 高程读书笔记 第六章 面向对象程序设计
  • 诡异!React stopPropagation失灵
  • 简单基于spring的redis配置(单机和集群模式)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 十年未变!安全,谁之责?(下)
  • 算法---两个栈实现一个队列
  • 我看到的前端
  • 国内开源镜像站点
  • ​Spring Boot 分片上传文件
  • ​插件化DPI在商用WIFI中的价值
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (~_~)
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (3)llvm ir转换过程
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Java入门)抽象类,接口,内部类
  • (k8s)Kubernetes本地存储接入
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (第二周)效能测试
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .bashrc在哪里,alias妙用
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)