【LeetCode面试经典150题】105. 从前序与中序遍历构造二叉树

一、题目

  • 105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)
  • 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

二、思路

  1. 每一次递归都可以把一棵大树拆分为左右子树和根元素,符合递归的问题细分原则,使用递归解决;
  2. 递归时每一层递归工作就是单一的生成当前结点,赋值后连接至上一层递归,每一层都会递归处理该节点的左右子树,直到当前节点为null,见解法一
  3. 优化方法,每层递归都需要做一次for循环获取当前根在中序遍历中的下标,可以通过一个HashMap提前保存中序遍历中的所有值及其下标,每次获取时只需要get一下就行,见解法一(优化)

三、解法

解法一

class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {// 初始时int preB = 0;int preE = preorder.length;int inB = 0;int inE = inorder.length;return recursion(preorder, preB, preE, inorder, inB, inE);}private TreeNode recursion(int[] preorder, int preB, int preE,int[] inorder, int inB, int inE) {// 1. 划定终止条件: 已经遍历到叶节点的子结点(null)了if (preB == preE) {return null; // 返回上一层}// 2. 生成结点并插入树中对应位置int curRoot = preorder[preB]; // 先序: 根左右TreeNode node = new TreeNode(curRoot);// 3. 计算新左右子树的起止下标// 新左子树: 中序遍历中根结点的左方// pre - (3) [9] 20 15 7// in  - [9] (3) 15 20 7// 下标:// 先序: (先序起点 + 1) ---> (先序起点 + 1 + 左子树长度)// 中序: (中序起点) ---> (中序根位置)int inRootPos = 0;for (int i = inB; i < inE; i++) {if (curRoot == inorder[i]) {inRootPos = i;break;}}// 左子树长度求法: // - [9] (3) [15 20 7] // - 中序遍历根左边的部分int leftLen = inRootPos - inB;node.left = recursion(preorder, preB + 1, preB + 1 + leftLen,inorder, inB, inRootPos);// 新右子树: 中序遍历中根结点的右方// pre - (3)  9  [20 15 7]// in  -  9  (3) [15 20 7]// 下标:// 先序: (先序起点 + 1 + 左子树长度) ---> (先序终点)// 中序: (中序根位置 + 1) ---> (中序终点)node.right = recursion(preorder, preB + 1 + leftLen, preE,inorder, inRootPos + 1, inE);return node;}
}

解法一(优化)

class Solution {private final HashMap<Integer, Integer> map = new HashMap();public TreeNode buildTree(int[] preorder, int[] inorder) {int preB = 0;int preE = preorder.length;int inB = 0;int inE = inorder.length;for (int i = 0; i < inorder.length; i++) {map.put(inorder[i], i);}return recursion(preorder, preB, preE, inorder, inB, inE);}private TreeNode recursion(int[] preorder, int preB, int preE,int[] inorder, int inB, int inE) {if (preB == preE) {return null;}int curRoot = preorder[preB];TreeNode node = new TreeNode(curRoot);int inRootPos = map.get(curRoot);int leftLen = inRootPos - inB;node.left = recursion(preorder, preB + 1, preB + 1 + leftLen,inorder, inB, inRootPos);node.right = recursion(preorder, preB + 1 + leftLen, preE,inorder, inRootPos + 1, inE);return node;}
}

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

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

相关文章

Dynamics 365 on-premise 隐藏高级查找导出按钮

提示 着急可以直接看结果代码部分 背景 Dynamics 365 on-premise中有个高级查找的功能,查询的结果支持导出,如下图 业务反馈这个有数据安全风险,要修改显示规则。 一开始想着能用RibbonWorkbench改,就很爽快得答应了业务。结果用RibbonWorkbench改不了。 反复尝试 既…

Linux远程管理日志

实验介绍 本实验旨在实现主机将日志远程发送到堡垒机或远程服务器上&#xff0c;实现通过一台机器管理整个网络内的主机的效果。 准备两台虚拟机作为生产主机和管理机&#xff0c;保证网络通畅&#xff0c;展示如下&#xff1a; 关闭firewalld&#xff0c;通过配置rsyslog&a…

Sklearn之朴素贝叶斯应用

目录 sklearn中的贝叶斯分类器 前言 1 分类器介绍 2 高斯朴素贝叶斯GaussianNB 2.1 认识高斯朴素贝叶斯 2.2 高斯朴素贝叶斯建模案例 2.3 高斯朴素贝叶斯擅长的数据集 2.3.1 三种数据集介绍 2.3.2 构建三种数据 2.3.3 数据标准化 2.3.4 朴素贝叶斯处理数据 2.4 高斯…

Treeselect是介绍及使用(梳理了我使用这个组件遇到的大部分问题)

介绍&#xff1a; Treeselect是一款基于Vue.js的树形选择器组件&#xff0c;可以快速地实现树形结构的选择功能。 这里梳理了我使用这个组件遇到的大部分问题 安装依赖&#xff1a; 首先&#xff0c;你需要在你的项目中安装Treeselect的依赖。这通常可以通过npm或yarn等来完…

基于STM32和人工智能的智能农业监测系统

目录 引言环境准备智能农业监测系统基础代码实现&#xff1a;实现智能农业监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能农业管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业监测系统通过结合STM32嵌…

Linux - 输入输出

一、输出格式 echo //末尾自带换行 -n //取消自带换行 -e //支持转移符 常见转义符 \n换行 \t制表符 printf // 格式化输出字符串 %-10s // %s代表字符串 -10 左对齐容纳10个字符 二、输入输出重定向 file descriptors &#x…

Java集合底层源码剖析-Vector和Stack

文章目录 概述Vector成员变量关键方法添加元素 (add, addElement)删除元素 (remove)注意事项 Stack类定义与继承压栈 (push)弹栈 (pop)查看栈顶元素 (peek)源码解析总结 概述 在Java中&#xff0c;Stack 类是一个基于 Vector 实现的经典栈数据结构。由于 Vector 类本身是线程安…

Python | Leetcode Python题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack:def __init__(self):self.stack []self.min_stack [math.inf]def push(self, x: int) -> None:self.stack.append(x)self.min_stack.append(min(x, self.min_stack[-1]))def pop(self) -> None:self.stack.pop()sel…

AD域离线破解新思路:Trustroasting和TimeRoasting

简介 近期Tom Tervoort发表了白皮书《TIMEROASTING, TRUSTROASTING AND COMPUTER SPRAYING》并在Github发布了名为Timeroast的工具包&#xff0c;其中介绍了几种新的攻击思路TimeRoasting、Trustroasting和计算机账户密码喷洒&#xff0c;本篇文章主要对TimeRoasting和Trustro…

从零开始:使用ChatGPT快速创作引人入胜的博客内容

随着科技的飞速发展&#xff0c;人工智能逐渐渗透到我们生活的各个领域。无论是商业、教育还是娱乐&#xff0c;AI技术都在以惊人的速度改变着我们。特别是在内容创作领域&#xff0c;人工智能正发挥着越来越重要的作用。今天&#xff0c;我将和大家分享如何从零开始&#xff0…

无约束动态矩阵控制(DMC)

0、前言 动态矩阵控制&#xff08;Dynamic Matrix Control&#xff0c;DMC&#xff09;是一种典型的模型预测控制方法&#xff0c;其不需要被控对象的数学模型&#xff0c;只需要获取被控对象的阶跃响应序列即可实现控制效果&#xff0c;但其需要被控对象是渐近稳定的。 1、稳…

SVN学习(002 svn冲突解决)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第20p-第p29的内容 冲突 产生冲突的操作 &#xff08;第一种 相互不影响的操作&#xff09; 用户1修改第二行 用户2修改第四行 用户1提交 用户2提交&#xff0c;提交的时候会提示版本已过时 这时将用…

常见漏洞扫描工具

Fortify Fortify是Micro Focus旗下AST &#xff08;应用程序安全测试&#xff09;产品&#xff0c;其产品组合包括&#xff1a;Fortify Static Code Analyzer提供静态代码分析器&#xff08;SAST&#xff09;&#xff0c;Fortify WebInspect是动态应用安全测试软件&#xff08…

Hadoop 2.0 大家族(一)

目录 一、Hadoop 2.0大家族概述&#xff08;一&#xff09;分布式组件&#xff08;二&#xff09;部署概述 二、ZooKeeper&#xff08;一&#xff09;ZooKeeper简介&#xff08;二&#xff09;ZooKeeper 入门 一、Hadoop 2.0大家族概述 &#xff08;一&#xff09;分布式组件 …

python flask 连接mysql

from flask import Flask, render_template from datetime import datetime from flask_sqlalchemy import SQLAlchemyapp Flask(__name__) # MySQL所在的主机名 HOSTNAME 127.0.0.1 # MySQL监听端口号&#xff0c;默认3306 PORT 3306 # 连接MySQL的用户名 USERNAME root #…

如何使用bt引擎-蚂蚁磁力搜索引擎大全?

bt引擎-蚂蚁磁力链接是一种特殊的下载链接&#xff0c;磁力链接可以理解为一个文件识别码&#xff0c;而并非具体的资源地址&#xff0c;下载软件需要拿着这个识别码去整个互联网(DHT网络)去寻找持有该资源的用户(节点)&#xff0c;如果找到则可以进行传输下载。一般年代越久远…

代码随想录算法训练营DAY43|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

完全背包 题目链接&#xff1a;完全背包 def material_bag(N, V, weight, value):dp [0] * (V1)for i in range(N):for j in range(weight[i], V1):dp[j]max(dp[j], dp[j-weight[i]]value[i])return dp[V]if __name____main__:N,V map(int, input().split())weight []valu…

不懂索引,简历上都不敢写自己熟悉SQL优化

大家好&#xff0c;我是考哥。 今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握SQL优化还重要&#xff0c;索引是优化SQL的前提和基础&#xff0c;我们一步步来先打好地基。 当MySQL表数据量不大时&#xff0c;缺少索引对查询性能的影响不会太大&#x…

用电子表单替代纸质表格,签到报名、出入登记更轻松

用纸质表格收集信息时&#xff0c;常常会出现数据丢失、不易统计等问题。我们可以搭建电子表单来代替线下纸质表格&#xff0c;进行信息收集、记录数据。 这些数据会保存在账号下&#xff0c;可以导出Excel或PDF进行存档&#xff1b;也可以根据企业要求自定义PDF导出格式。 并…

Linux 6.10也引进了蓝屏机制

众所周知&#xff0c;win死机后会有个蓝屏死机的故障提示页面&#xff0c;Linux 6.10 开始也将引入这个机制。 Linux 6.10 引入了一个新的 DRM Panic 处理程序基础设施&#xff0c;以便于在致命错误&#xff08;Panic&#xff09;发生时显示相关信息。 Linux 6.10 还在开发之…