leetcode:105从前序与中序遍历序列构造二叉树

105:从前序与中序遍历序列构造二叉树

啊,好久都没有更新算法题目了。曾今是C++,如今是Java,感慨啊。

像树这样的算法题,基本都逃不开递归。递归的思想是:将大任务拆分为小任务。我们不妨构建一个函数,取名func1(),它实现的功能是:在指定区间内, 找到并构建root节点并返回

如果我们想要构建一棵树,只需要调用func1(),就能够得到树的根节点,那么树的构建过程就可以简化为如下形式:

TreeNode root = new TreeNode();
root.value = value;
root.left = func1(...);
root.right = func1(...)'

通过func1,我们即可计算得到左右节点,具体的逻辑都一样

现在,让我们将视角聚焦于如何构建func1()。函数内容的核心是:构建root节点。构建分为三步: 1.得到root.val,构建root.left,构建root.right。为了解决这个内容,我们先将 前序遍历中序遍历写为以下形式

前序 : 【root,(左子树),(右子树)】
中序 : 【(左子树),root,(右子树)】

如果我们想要确定root节点,我们只需要在前序数组中,获取第一个元素即可。如果我们想要确定左子树长度,右子树长度,我们只需要知道中序中,root节点的index即可

我们假设前序数组的区间范围是: [ l 1 , r 1 ] [ l1, r1 ] [l1,r1]中序是: [ l 2 , r 2 ] [l2, r2] [l2,r2]。root节点在中序的下标是 r o o t I d x I n rootIdxIn rootIdxIn,那么左子树长度 l e f L e n = r o o t I n d I n − l 2 lefLen = rootIndIn - l2 lefLen=rootIndInl2右子树长度 r i g L e n = r 2 − r o o t I n d I n rigLen = r2 - rootIndIn rigLen=r2rootIndIn

rootValue很好获取,前序[l1]。
root.left的获取,我们可以交给递归函数完成。因为root.left,其本质是左子树的root节点,规定func1的计算范围是root节点的左子树范围即可完成计算;
root.right同理。

tip : 笔者习惯将递归函数命名为dfs,但这不是真正的dfs

/*** 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 {public HashMap<Integer, Integer> map = new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {int n = preorder.length;// 通过map映射 值-index的方式, 加速root节点在中序数组下标的定位速度for (int i = 0; i < inorder.length; ++i) {map.put(inorder[i], i);}return dfs(preorder, inorder, 0, n - 1, 0, n - 1);}public TreeNode dfs(int[] preorder, int[] inorder, int l1, int r1, int l2, int r2) {// 递归终止条件, 如果l1 > r1, 表明当区间不存在, 节点值应该赋为nullif (l1 > r1 || l2 > r2) return null;// debugSystem.out.println("l1 = " + l1 + " r1 = " + r1 + " l2 = " + l2 + " r2 = " + r2);// 确定根节点int rootVal = preorder[l1];// 根节点再inorder中的indexint rootIdxIn = map.get(rootVal);System.out.println("rootIdxIn = " + rootIdxIn);// 左区间长度int lefLen = rootIdxIn - l2;// 右区间长度int rigLen = r2 - rootIdxIn;TreeNode root = new TreeNode();root.val = rootVal;root.left = dfs(preorder, inorder, l1 + 1, l1 + lefLen, l2, rootIdxIn - 1);root.right = dfs(preorder, inorder, l1 + lefLen + 1, r1, rootIdxIn + 1, r2);return root;}
}

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

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

相关文章

LLM ReAct: 将推理和行为相结合的通用范式 学习记录

LLM ReAct 什么是ReAct? LLM ReAct 是一种将推理和行为相结合的通用范式,可以让大型语言模型(LLM)根据逻辑推理(Reason),构建完整系列行动(Act),从而达成期望目标。LLM ReAct 可以应用于多种语言和决策任务,例如问答、事实验证、交互式决策等,提高了 LLM 的效率、…

2022年亚太杯APMCM数学建模大赛B题高速列车的优化设计求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 B题 高速列车的优化设计 原题再现&#xff1a; 2022年4月12日&#xff0c;中国高铁复兴号CR450动车组在开放线上成功实现单车时速435公里&#xff0c;相对速度870公里&#xff0c;创造了高铁动车组列车穿越开放线和隧道速度的世界纪录。新一代…

深度神经网络时与协方差矩阵

平时训练深度神经网络时&#xff0c;什么时候用到了协方差矩阵 在深度神经网络的平时训练过程中&#xff0c;一般情况下不直接使用协方差矩阵。然而&#xff0c;协方差矩阵的概念和相关性的考虑在某些情况下可以对网络的训练和优化起到一定的指导作用。 下面是一些与协方差矩…

用python写一个贪吃蛇的程序能运行能用键盘控制

用python写一个贪吃蛇的程序能运行能用键盘控制 1.源码2.运行效果 1.源码 开发库使用&#xff1a;pygame random 直接在终端运行&#xff1a;pip install pygame pycharm安装库&#xff1a;文件-设置-项目-Python 解释器 import pygame import random# 初始化pygame pygame…

Date3

语法 Date3(year, month, day) 描述 The Date3 function accepts a date expressed as three integers: year, month, and day. It returns a corresponding Date value. If the date is invalid, the Date3 displays an error message. Warning! Make sure that you pass a…

牛客小白月赛79 D

题意&#xff1a; 给定数 x &#xff0c;每次可以选择将 x 变为 x*2 &#xff0c;或是将 x 变为 x1&#xff0c;求 x 变为 2 20 2^{20} 220倍数的最小代价。 思路&#xff1a; 因为对于 2 20 2^{20} 220次方倍数的点无意义&#xff0c;所以总共的点数只用 2 20 2^{20} 220即…

2023年中国轮胎模具需求量、竞争格局及行业市场规模分析[图]

轮胎模具是轮胎生产线中的硫化成形装备&#xff0c;是高技术含量、高精度及高附加值的个性化模具产品&#xff0c;尤其是轮胎的花纹、图案、字体以及其他外观特征的成形都依赖于轮胎模具&#xff0c;因此其制造技术难度较高。其主要功能是通过所成型材料&#xff08;主要是橡塑…

最优化:建模、算法与理论(最优性理论2

5.7 约束优化最优性理论应用实例 5.7.1 仿射空间的投影问题 考虑优化问题 min ⁡ x ∈ R n 1 2 ∣ ∣ x − y ∣ ∣ 2 2 , s . t . A x b \min_{x{\in}R^n}\frac{1}{2}||x-y||_2^2,\\ s.t.{\quad}Axb x∈Rnmin​21​∣∣x−y∣∣22​,s.t.Axb 其中 A ∈ R m n , b ∈ R m …

2024免费的苹果电脑杀毒软件cleanmymac X

苹果电脑怎么杀毒&#xff1f;这个问题自从苹果电脑变得越来越普及&#xff0c;苹果电脑的安全性问题也逐渐成为我们关注的焦点。虽然苹果电脑的安全性相对较高&#xff0c;但仍然存在着一些潜在的威胁&#xff0c;比如流氓软件窥探隐私和恶意软件等。那么&#xff0c;苹果电脑…

uniapp下载附件保存到手机(文件、图片)ios兼容

downloadFile(file)&#xff0c;其中file为下载的文件地址uni.downloadFile图片使用uni.saveImageToPhotosAlbum【安卓、ios都合适】文件使用uni.openDocument【安卓图片也可以用这个&#xff0c;ios会失败】 // 下载文件 export function downloadFile(file) {let acceptArr …

【LeetCode:2316. 统计无向图中无法互相到达点对数 | BFS + 乘法原理】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

大模型LLM相关面试题整理-PEFT

Prefix/Prompt-Tuning&#xff1a;在模型的输入或隐层添加 个额外可训练的前缀 tokens&#xff08;这些前缀是连续的伪 tokens&#xff0c;不对应真实的 tokens&#xff09;&#xff0c;只训练这些前缀参数&#xff1b; Adapter-Tuning&#xff1a;将较小的神经网络层或模块插入…

面试题 01.04. 回文排列

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 01.04. 回文排列 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 对字符串中各字符计数&#xff0c;若个数为奇数的字符个数大于 1&#xff0c;则不是回文排列&#xff0c;否则是。 …

uniapp 小程序优惠劵样式

先看效果图 上代码 <view class"coupon"><view class"tickets" v-for"(item,index) in 10" :key"item"><view class"l-tickets"><view class"name">10元优惠劵</view><view cl…

c++ 常见类内的关键字

1. override override 是一个关键字&#xff0c;用于显式地标记派生类中重写&#xff08;覆盖&#xff09;基类虚函数的意图。 override 并不会影响程序的执行结果&#xff0c;仅仅是作用于编译阶段&#xff0c;用于检查子类是否真的重写父类函数 作用&#xff1a; 帮助发现错…

基于Java的图书商城管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Hive用户中文使用手册系列(一)

Apache Hive 在标题为“Information Platforms and the Rise of the Data Scientist”的文章一文中&#xff0c;Jeff Hammerbacher把“信息平台”描述为“企业摄取(ingest)、处理(process)、生成(generate)信息的行为”与“帮助加速从经验数据中学习”的“中心”。 在Facebook…

Linux之I2C应用编程

I2C-Tools的交叉编译 tar xvf i2c-tools-4.2.tar.xz 首先解压下压缩包 cd i2c-tools-4.2 进入 i2c-tools-4.2目录 make USE_STATIC_LIB1 执行 make 将i2cset ,i2cget ,i2cdump,i2cdetect,i2ctransfer放到板子上 命令直接操作IIC设备 命令行直接操作iic向AP3216C传感器获取数据…

即时通讯或者推送消息的守护进程?开启几个进程?

进程根据状态可以分为三种进程&#xff0c;守护进程&#xff0c;僵尸进程&#xff0c;孤儿进程。今天我们着重来分析下守护进程。 1.daemon? &#xff08;1&#xff09;概念 守护进程 (daemon) 是一类在后台运行的特殊进程&#xff0c;用于执行特定的系统任务。很多守护进程…

初出茅庐的小李博客之Windows11运行Linux记录

安装教程 超简单&#xff0c;不安装虚拟机&#xff0c;Windows11运行Linuxhttps://zhuanlan.zhihu.com/p/393484912 注意事项 出现错误有可能是少了驱动 驱动下载地址 https://link.zhihu.com/?targethttps%3A//wslstorestorage.blob.core.windows.net/wslblob/wsl_updat…