leetcode 105. 从前序与中序遍历序列构造二叉树【构造二叉树】

原题链接:105. 从前序与中序遍历序列构造二叉树

题目描述:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

输入输出描述:

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

解题思路:

题目要求我们根据前序遍历和中序遍历构造出这棵二叉树,下面画个图来分析一下:

每次在inorder中暴力找根结点的时间复杂度为O(n),我们可以先用一个哈希表记录inorder中所有数字的下标,就可以把这个找的过程优化到O(1),根据上述分析,直接递归构造即可,具体分析见代码处.

cpp代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    unordered_map<int, int> index;
    TreeNode* buildTree(vector<int>& preorder,vector<int>& inorder,int pre_left,int pre_right,int in_left,int int_right)
    {
        if(pre_left>pre_right){  //空树,直接返回空
            return nullptr;
        }

        int v=preorder[pre_left]; //根结点是preorder第一个数
        TreeNode* root=new TreeNode(v); //建立根结点
        int pos=index[v];  //拿到根节点在inorder中的位置索引

        int leftLen=pos-in_left;  //根据根结点在inorder中的位置索引计算当前子树的左子树的长度

        //构造当前子树的左子树
        root->left=buildTree(preorder,inorder,pre_left+1,pre_left+leftLen,in_left,pos-1);
        //构造当前子树的右子树
        root->right=buildTree(preorder,inorder,pre_left+leftLen+1,pre_right,pos+1,int_right);
        return root;
    }
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        index.clear();
        int n=inorder.size();
        for(int i=0;i<n;i++){
            index[inorder[i]]=i; //用一个哈希表记录inorder中所有数字所在位置的索引
        }
        return buildTree(preorder,inorder,0,n-1,0,n-1);  //直接递归构造
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ETL快速拉取物流信息

我国作为世界第一的物流大国&#xff0c;但是在目前的物流信息系统还存在着几大的痛点。主要包括以下几个方面&#xff1a; 数据孤岛&#xff1a;有些物流企业各个部门之间的数据标准不一致&#xff0c;难以实现数据共享和协同&#xff0c;容易导致信息孤岛。 操作繁琐&#x…

小程序--loading和toast

一、loading wx.showLoading({})显示loading提示框。wx.hideLoading({})隐藏loading提示框。 title&#xff1a;文字提示内容 mask&#xff1a;是否显示透明蒙层&#xff0c;防止触摸穿透。 更多属性参考showLoading官方文档。 wx.showLoading({title: 加载中...,mask: true }…

HTML学习笔记——08:表单<form>

HTML <form> 元素表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;用于向 Web 服务器提交信息。 例如&#xff1a;登录页面。 作用&#xff1a;搜集不同类型的用户输入&#xff0c;并向服务器传送数据。 注意&#xff1a;表单本身并不可见&#xff01;…

Git基本操作(2)

Git基本操作&#xff08;2&#xff09; 上交文件之后&#xff0c;git文件的变化git cat-file HEAD指针里面有啥文件被修改git statusgit diff 文件名 版本回退&#xff08;git reset&#xff09;撤销回退git reflog 撤销的三种情况还没有addgit checkout -- [file] 已经add还没…

全志 T527 适配 I2S

一、背景概念 在 T5 系列芯片中&#xff0c;内置了一个 AudioHub 模块&#xff0c;使用的 是I2S 接口&#xff0c;都跟 AudioHub 关联在一起&#xff0c;此时外挂的声卡若想正常工作&#xff0c;还需要配置 AudioHub 的路由信息。&#xff08;AudioHub 是全志 T527 特有的模块&…

【Java程序员面试专栏 数据结构】三 高频面试算法题:栈和队列

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,因为栈和队列这两哥们结构特性比较向对应,所以放到一篇Blog中集中练习 题目题干直接给出对应博客链接,这里只给出简单思路、代码实现、复杂度分析 题目关键字…

高考杂志高考杂志社高考编辑部2023年第32期目录

高考论坛 高中数学课堂教学中创设有效情境的策略探究 黄进生; 3-5 核心素养为导向的高中物理教学探究 王丽萍; 6-8 高中化学“教、学、评”一体化教学模式的有效应用 陈燕; 9-11《高考》投稿&#xff1a;cn7kantougao163.com 新高考背景下高中英语阅读理解教学…

xshell安装社区(免费)版本

xshell安装社区(免费)版本 官方网址&#xff0c;点击直接跳转&#xff1a;https://www.xshell.com/zh/free-for-home-school/ 1.打开链接之后&#xff0c;先选择 家庭/学校免费 &#xff0c;然后输入名字和邮箱&#xff0c;勾选需要下载的资源&#xff1a; 2.然后邮箱就会收到…

Dockerfile文件中只指定挂载点会发生什么?

当你在VOLUME指令中只指定容器内的路径&#xff08;挂载点&#xff09;而不指定宿主机的目录时&#xff0c;Docker会为该挂载点自动生成一个匿名卷。这个匿名卷存储在宿主机的某个位置&#xff0c;但这个具体位置是由Docker自动管理的&#xff0c;用户通常不需要关心这个存储位…

JavaScript 设计模式之组合模式

组合模式 在我们日常中肯呢个会将一个表单用这种模式来创建 const Car function () { } Car.prototype.getName function () { throw new Error("需要重写该方法") } Car.prototype.getPrice function () {throw new Error("需要重写该方法") } const…

K8S临时小结

k8s是什么&#xff1f;能解决什么问题&#xff1f; k8s是容器管理平台&#xff0c;一套复杂的开源系统 如何更好的维护pod&#xff0c;k8s第二大要素&#xff08;pod控制器&#xff09; k8s的很多对容器&#xff08;pod&#xff09;管理的高级特性&#xff0c;都是基于控制器…

HarmonyOS—@Observed装饰器和@ObjectLink嵌套类对象属性变化

Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 概述 ObjectLink和Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步&#xff1a; 被Observed装饰的类&#xff0c;可以被观察到属性的变化&#xff1b;子组件中ObjectLink装饰器装饰的状…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

目录 一、GPIO 概述二、GPIO模块相关API三、实例四、GPIO HDF驱动开发4.1、LED驱动程序(待续...)4.2、LED驱动配置(待续...) 坚持就有收获 轻量系统设备通常需要进行外设控制&#xff0c;例如温湿度数据的采集、灯开关的控制&#xff0c;因此在完成内核开发后&#xff0c;需要进…

Rancher实用篇-使用rancher,部署微服务应用

说到rancher&#xff0c;我们必须先了解一下k8s 一、k8s简介 Kubernetes&#xff08;通常简写为 K8s&#xff09;是一个开源的容器管理系统&#xff0c;由Google于2014年发起&#xff0c;并在2015年贡献给Cloud Native Computing Foundation (CNCF)进行维护。它基于Borg项目的…

app逆向-平头哥框架ratel使用

文章目录 一、前言二、实现逻辑1、安装ratel手机端app2、使⽤电脑端进⾏感染目标app3、开发⼀个平头哥插件 一、前言 平头哥&#xff08;ratel&#xff09;是⼀个Android逆向分析⼯具套件&#xff0c;他提供⼀系列渐进式app逆向分析⼯具。同时平头哥也是⼀个app⼆次开发的沙箱…

从0到1的私域流量体系搭建,私域操盘手的底层认知升级

一、教程描述 本套私域操盘手教程&#xff0c;大小4.31G&#xff0c;共有12个文件。 二、教程目录 01第一课、私域能力必修&#xff1a;私域大神熟记于心的高阶私域体系.mp4 02第二课、私域IP打造&#xff1a;那些忍不住靠近的私域IP如何打造的.mp4 03第三课、朋友圈经济&…

秦岭天台山隧道群荣获交通运输部科技示范工程,恒星科通群载波应急广播与无线调度系统产品应用其中

2023年9月12日&#xff0c;全国交通运输科技示范工程现场推进会在河南省平顶山市召开&#xff0c;会上为全国已通过验收的10项科技示范工程进行了授牌&#xff0c;其中由陕西交控集团负责实施的“秦岭天台山超长隧道群安全绿色科技示范工程”名列其中。 该科技示范工程为陕西省…

共享WiFi贴是什么,究竟安不安全?

在现代社会中&#xff0c;移动设备和互联网已经成为我们日常生活中不可或缺的一部分。为了方便我们的网络使用&#xff0c;越来越多的人选择使用公共WiFi&#xff0c;但是安全性成了很大的问题。而随着共享WiFi贴的出现&#xff0c;我们是否可以更加安全便捷地使用WiFi呢&#…

不会这个小技巧,你敢说你会零售营销?

新零售模式是随着科技的不断发展而崭露头角的商业模式之一&#xff0c;其核心理念在于将线上线下融合&#xff0c;通过智能技术提升购物体验和效率。 自动售货机作为新零售模式中的一种典型体现&#xff0c;通过数字化、自动化的手段&#xff0c;为消费者提供更为便捷、个性化的…

【C++】C++11下线程库

C11下线程库 1. thread类的简单介绍2.线程函数参数3.原子性操作库(atomic)4.mutex的种类5. RAII风格加锁解锁5.1Lock_guard5.2unique_lock 6.condition_variable 1. thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如wi…