[力扣]根据前中序构造二叉树--详细解析

根据前中序遍历顺序构建一个二叉树

力扣练习链接

过程

在这里插入图片描述

总体框架

  • preorder的左边界为pleft,右边界为pright[注意这里是闭区间能取到]
  • 同时设inorder的左边界为ileft,有边界为iright[同样也是可以取到的索引区间]
  • 我们生成每一个区间的树的头结点,然后向上返回,对于他的父亲结点,利用子树的返回值作为左右子节点

递归结构的设计

当区间内只有一个结点,继续遍历,直到区间取到空的树判断是否结束

  • 如果遍历到的右子树是空的,那么下一次会出现这种情况:ileft>iright

  • 同样的,如果左子树是空的,那么下一次会出现:iright<ileft
    所以结束条件这样去设计:

    if (ileft>iright||iright<ileft) return nullptr;

    去返回一个空的指针

寻找左右子树

  1. 对于以前序和中序遍历的树,他的结构如下:
    在这里插入图片描述

    遍历一遍 inorder 数组, 将所有的元素的以<元素值, 索引值>的结构存入哈希表中
    根结点的值就是inorder数组中的首元素
    但是我们需要在preorder中去找到根节点的索引位置
    通过之前构建哈希表,我们可以直接用头结点的值来得到它在inorder数组中的索引下标
    以左子树的区间为例, 在inorderpreorder区间中的长度相等,所以可以得到这样的等式:
    在这里插入图片描述

    in_mid-ileft = x - pleft

  2. 这样我们就得到了左子树的区间,preorder:[pleft+1, x]
    ineorder:[ileft, in_mid-1]

  3. 同样的,对于右子树的区间,preorder:[x+1, pright]
    ineorder:[in_mid+1, iright]

Coding

/*** 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 {
public:unordered_map<int, int> hash;TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int size = preorder.size();for (int i = 0; i < size; i++) {hash[inorder[i]] = i;}return f(preorder, inorder, 0, size-1, 0, size-1);}TreeNode* f(vector<int>& preorder, vector<int>& inorder, int pleft, int pright, int ileft, int iright) {if (ileft>iright || iright<ileft) {return nullptr;}int pleftValue = preorder[pleft];TreeNode* root = new TreeNode(pleftValue);int in_mid = hash[pleftValue];int x = pleft + in_mid - ileft;root->left = f(preorder, inorder, pleft+1, x, ileft, in_mid-1);root->right = f(preorder, inorder, x+1, pright, in_mid+1, iright);return root;}
};

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

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

相关文章

非关系型数据库-----------Redis的主从复制、哨兵模式

目录 一、redis群集有三种模式 1.1主从复制、哨兵、集群的区别 1.1.1主从复制 1.1.2哨兵 1.1.3集群 二、主从复制 2.1主从复制概述 2.2主从复制的作用 ①数据冗余 ②故障恢复 ③负载均衡 ④高可用基石 2.3主从复制流程 2.4搭建redis主从复制 2.4.1环境准备 2.4…

mysql计划事件即定时任务的实现

目录 前言设置系统参数创建计划事件时间间隔举例 前言 在MySQL中&#xff0c;创建一个定时任务&#xff08;即“计划事件”&#xff09;通常涉及使用EVENT对象。有些时候使用mysql定时任务做一些批量处理是非常方便的&#xff0c;比如每天零晨记录头天的库存数据&#xff0c;发…

南京大学提出用于大模型生成的动态温度采样法,简单有效!

在自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;已经在各种下游语言任务中展现出了卓越的性能。这些任务包括但不限于问答、摘要、机器翻译等。LLMs的强大能力在于其生成的文本质量和多样性。为了控制生成过程&#xff0c…

iptables 与 firewalld 防火墙

iptables iptables 是一款基于命令行的防火墙策略管理工具 四种防火墙策略&#xff1a; ACCEPT&#xff08;允许流量通过&#xff09; 流量发送方会看到响应超时的提醒&#xff0c;但是流量发送方无法判断流量是被拒绝&#xff0c;还是接收方主机当前不在线 REJECT&#xff08…

VMware创建Ubuntu虚拟机详细教程

下载ISO映像文件 进入官网下载&#xff1a;Download Ubuntu Desktop | Download | Ubuntu 下面是一些其他的下载路径&#xff1a; 中国官网 https://cn.ubuntu.com/ 中科大源 Index of /ubuntu-releases/ (ustc.edu.cn) 阿里云开源镜像站 ubuntu-releases安装包下载_开源镜像…

C语言——内存函数

引言 在之前的两篇文章中&#xff0c;我们学习了字符函数和字符串函数&#xff0c;C语言中还有一类库函数叫做内存函数 我们接下来去学习一下这类函数 内存函数 内存函数的功能和某些字符函数的功能相似&#xff0c;它们是通过访问地址的方式操作对象&#xff0c;可应用于任…

MySQL生产环境常见故障及解决方案汇总

MySQL生产环境常见故障及解决方案汇总 1. MySQL主从同步异常故障1.1. 情景说明1.2. 排查过程1.3. 数据同步2. MySQL慢查询故障1. MySQL主从同步异常故障 1.1. 情景说明 MySQL主库网卡需要更换IP地址,并将原IP地址配置为MySQL集群的VIP地址,上层应用程序其实不需要更改连接My…

docker版Elasticsearch安装,ik分词器安装,用户名密码配置,kibana安装

1、安装es和ik分词器 创建映射目录并赋予权限&#xff1a; mkdir -p /docker_data/elasticsearch/conf mkdir -p /docker_data/elasticsearch/data mkdir -p /docker_data/elasticsearch/plugins chmod -R 777 /docker_data/elasticsearch编写配置文件&#xff1a; vi /dock…

Spring拓展点之SmartLifecycle如何感知容器启动和关闭

Spring为我们提供了拓展点感知容器的启动与关闭&#xff0c;从而使我们可以在容器启动或者关闭之时进行定制的操作。Spring提供了Lifecycle上层接口&#xff0c;这个接口只有两个方法start和stop两个方法&#xff0c;但是这个接口并不是直接提供给开发者做拓展点&#xff0c;而…

1379. 找出克隆二叉树中的相同节点

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始…

大模型量化技术-AWQ

大模型量化技术-AWQ 在2023年6月,Ji Lin等人发表了论文AWQ:Activation-aware Weight Quantization for LLM Compression and Acceleration。 这篇论文详细介绍了一种激活感知权重量化算法,可以用于压缩任何基于 Transformer 的语言模型,同时只有微小的性能下降。关于 AWQ 算…

Golang和Java的对决:从设计理念到工具链的全面比较

文章目录 使用率排名Golang和Java设计理念语法和类型系统并发处理资源消耗生态系统和工具链 结语 使用率排名 据最新的2024年3月 Tiobe 编程语言排行榜&#xff0c;目前 Golang 的使用率排名为第8呈上升趋势&#xff0c;Java 的使用率排名为第4呈下降趋势 2024年3月2023年3月…