Leetcode-每日一题【剑指 Offer 07. 重建二叉树】

news2024/11/28 0:36:37

题目

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]


示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

  • 0 <= 节点个数 <= 5000

解题思路

1.题目要求我们利用前序遍历和中序遍历构建出二叉树,我们可以画图来理解一下

举个例子:

根据我们对数据结构中二叉树部分的学习,我们知道前序遍历是(根左右)所以第一个元素一定是这颗二叉树的根。

 

那么中序遍历是(左右根),所以数字 3 左边的是它的左子树部分,右边的是他的右子树部分。 设 3 在数组 inorder中的下标为 i,

前序遍历:左子树部分 [ l1 + 1, l1 + (i - l2) ]     右子树部分 [l2, i - 1]

中序遍历:左子树部分 [l1 + (i - l2) + 1, r1]    右子树部分[i + 1, r2]

 

 我们按照这个思想继续处理 3 的左子树和右子树, 也就是进行递归操作,

3 的左子树中 9 为根节点,那么 5 和 6 为 9 的左右子树,3 的右子树中 20 为根节点,15 和7 为 3 的左右子树。最终生成的数如下图所示

 2.代码部分首先我们判断所给数组是否为空,若为空直接返回 null;然后我们新建一个map 用于存储inorder数组的下标和对应的值,方便我们后序对 root 所对应的数组下标进行查找。

然后我们让root = f( ) 函数。

3.f( ) 函数的作用是利用传入的前序遍历和中序遍历的数组,找到二叉树的 root 节点,并将数组划分为 root 节点的左右子树。结束条件为 r1 < l1 && r2 < l2。处理完成后返回 root 即可。

代码实现

class Solution {
     Map<Integer,Integer> map = new HashMap();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder == null || preorder.length <= 0){
            return null;
        }
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i],i);
    }
    TreeNode root = f(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
         return root;
    }
    public TreeNode f(int[] preorder, int l1, int r1, int[] inorder, int l2, int r2){
        if(r1 < l1 && r2 < l2){
            return null;
        }
        TreeNode root = new TreeNode(preorder[l1]);
        int i = map.get(preorder[l1]);
        root.left = f(preorder, l1 + 1, l1 + (i - l2), inorder, l2, i - 1);
        root.right = f(preorder,l1 + (i - l2) + 1, r1, inorder, i + 1, r2);
        return root;

    }
}

测试结果

 

 

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

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

相关文章

【Python小demo】JOJO替身面板生成

文章目录 1 前言2 代码实现3 总结 1 前言 最近暑假在数模研赛备赛&#xff0c;情理之中地接触了一些图表。也是第一次才知道雷达图这么个图表形式&#xff0c;用于直观地评价多个变量或指标。看到雷达图&#xff0c;我不禁联想到了JOJO中的替身面板&#xff0c;于是兴起想用Py…

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用&#xff0c;与任何其他平台的部署相同&#xff0c;可以2种方式&#xff1a; 依赖于框…

Zebec Protocol ,不止于 Web3 世界的 “Paypal”

Paypal 是传统支付领域的巨头企业&#xff0c;在北美支付市场占有率约为 77% 以上。从具体的业务数据看&#xff0c;在8月初&#xff0c;Paypal 公布的 2023 年第二季度财报显示&#xff0c;PayPal 第二季度净营收为 73 亿美元&#xff0c;净利润为 10.29 亿美元。虽然 Paypal …

【C# 基础精讲】运算符和表达式

在C#编程中&#xff0c;运算符和表达式是构建复杂逻辑的关键元素。运算符用于执行各种数学、逻辑和其他操作&#xff0c;而表达式则由运算符、变量、常量和函数组成&#xff0c;用于生成计算结果。本文将详细介绍C#中常见的运算符和表达式的概念&#xff0c;以及它们在程序中的…

全面讲解最小二乘法

常见的最小二乘法我们就不多说了&#xff0c;下面主要介绍一下最小二乘法的一些先进方法。 正则化的最小二乘法 在使用常见的最小二乘法进行回归分析时&#xff0c;常常会遇到过拟合的问题&#xff0c;也就是在训练数据集上表现的很好&#xff0c;但是在测试数据集上表现的很…

Flutter 让软键盘不再自动弹起

1、问题说明&#xff1a; 在开发中&#xff0c;经常遇到这种事&#xff0c;一个页面有输入框&#xff0c;点击输入框后&#xff0c;会弹起软键盘&#xff0c;同时输入框会聚焦&#xff0c;手动收起软键盘后&#xff0c;点击另一个按钮前往下一个页面或者显示一个弹窗&#xff0…

heima头条项目学习--Day1: 环境搭建、SpringCloud微服务(注册发现、网关)

Nacos注册发现、网关 a. 项目介绍b. app登录1) 需求分析2) 表结构分析3) 手动加密&#xff08;md5随机字符串&#xff09;4) 用户端微服务搭建5) 功能实现6) app网关7) 网关校验jwt8) 前端集成, 配置nginx a. 项目介绍 业务说明 技术栈说明 [外链图片转存失败,源站可能有防盗…

Nginx的优化和防盗链(面试高频!!!)

Nginx的优化和防盗链 全篇高能&#xff01;&#xff01;&#xff01;&#xff01;干货较多&#xff01;&#xff01;&#xff01;&#xff01;本篇含面试高频题&#xff1a; 修改配置文件时&#xff0c;先备份&#xff01;&#xff01;&#xff01;以便回滚&#xff01;&…

API接口:企业信息核验

企业信息核验是现代企业管理中必不可少的一项业务&#xff0c;它可以帮助企业做出正确的决策。在这篇文章里&#xff0c;我们将会介绍如何使用API接口来对企业信息进行核验&#xff0c;并实现快捷、准确的查询。 一、API接口 在这里我们使用的是挖数据提供的企业信息核验API接…

医学影像PACS临床信息系统源码

医学影像临床信息系统&#xff08;Picture Archiving and Communication Systems&#xff09;PACS是指从医疗影像设备中获得数字影像&#xff0c;利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统&#xff0c;能实现影像数字化、无胶片化管理。 登记系统 …

MyCat水平分表

1.水平拆分案例场景 2.MyCat配置 这个表只是在 schema.xml配置的逻辑表&#xff0c;在具体的数据库里面是没有的 根据id的模确定数据存在哪个节点上&#xff01;&#xff01;

8.7 作业 c高级

1.写一个函数&#xff0c;获取用户的uid和gid并使用变量接收&#xff1a; #!/bin/bash function fun() {uidid -u ubuntugidid -g ubuntu }funecho "UID: $uid" echo "GID: $gid"思维导图&#xff1a;

(树) 剑指 Offer 54. 二叉搜索树的第k大节点 ——【Leetcode每日一题】

❓剑指 Offer 54. 二叉搜索树的第k大节点 难度&#xff1a;简单 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出…

【多音音频测试信号】具有指定采样率和样本数的多音信号,生成多音信号的相位降低波峰因数研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Jmeter响应中的乱码问题

文章目录 问题描述解决办法 问题描述 Jmeter在访问接口的时候&#xff0c;响应内容如果有中文可能会显示乱码 响应页面没有做编码处理&#xff0c;JMeter默认按照ISO-8859-1编码格式进行解析 解决办法 在线程组中添加BeanShell PostProcessor后置处理器 prev.setDataEnco…

爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028

然后再来看字符串的高级操作 取长度 查找字符串下标位置 判断是否以某个字符,开头结尾 计算字符出现次数 替换

STM32调试过程中的使用技巧及解决办法

文章目录 技巧 1.定时器使用过程中&#xff0c;分频系数越大&#xff0c;定时误差越大&#xff0c;越不准确。问题 2.编译时出现下述警告&#xff1a;解决办法&#xff1a; keil5 编译提示 single-precision operand implicity converted to double-precesion&#xff0c;意思是…

生成小程序二维码、小程序码

微信自定义生成二维码 使用微信云开发生成自定义二维码、小程序码话不多说&#xff0c;我们先来看最终的展示效果生成码有三种方式操作步骤1. 云环境的初始化2. 在页面上开辟一个容器来展示二维码&#xff08;包括预览和保存到相册的按钮&#xff09;3. 创建云函数4. 生成二维码…

黑客真的那么神奇吗?

对于这个话题我觉得我还是有发言权的&#xff0c;因为本人2008年从事这个行业至今已经是第八个年头。怎么进入这个行业的呢。说起来可笑因为当时家里并没有安装有线电视&#xff0c;而当时我才上初中有碰巧是奥运期间本人是个狂热体育迷所以只能去网吧看直播。兜里又没有几块钱…

按轨迹运行(纯跟踪)

文章目录 import numpy as np import math import matplotlib.pyplot as pltk = 0.1 # 前视距离系数 Lfc = 2.0 # 前视距离 Kp = 1.0 # 速度P控制器系数 dt = 0.1 # 时间间隔,单位:s L = 2.9 # 车辆轴距,单位:mdef plot_arrow(x, y, yaw, length=5, width=1):dx = len…