真是太凡尔赛了!贵州一女研究生,被省烟草局提前录取了...

时间:2024-02-23 10:37:15  热度:0°C

没工作的时候大家发愁,但工作机会多了也会发愁。最近有一位贵州的女硕士研究生说:自己被烟草局提前录取了,但她自己却高兴不起来,原因是自己学的是计算机,华为也发了offer,薪资待遇也不低。父母想让她去烟草,而自己想去华为闯一闯,现在十分纠结,不知道该怎么选择了。

而网友的回复基本上也出奇的一致:华为拿什么和烟草比。说明在目前的互联网环境下大家更看好的还是体制内的工作。互联网公司不被看好的原因除了经常加班以外,最主要的还是35岁之后的出路问题。

如果在中国的互联网公司所有人都能干到60岁退休,我想烟草是没法和互联网公司竞争的,我们来看下网友的评论。

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第105题:从前序与中序遍历序列构造二叉树。这题是考研常考的一道题,也是必须掌握的一道题,除此之外字节也考过这题,我们来看下:

问题描述

来源:LeetCode第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 保证为二叉树的中序遍历序列

问题分析

我们经常会对一棵二叉树进行前序和中序遍历,但这题让我们从前序与中序数组来构建二叉树。这题解法是比较多的,我们这里来看一种非常简单的解决方式。我们知道二叉树前序数组的第一个元素一定是根节点,因为前序遍历的顺序是先遍历根节点在遍历左右子树。而中序遍历是根节点的左子树都遍历完了才遍历根节点,所以在中序数组中,根节点前面的元素是他的左子树节点,后面的元素是他右子树的节点。根据这个特性我们可以把中序数组和前序数组划分两部分,然后每部分继续按照上面的方法划分,直到只有一个节点,不能划分为止。比如示例 1 的数组划分如下图所示。划分的时候我们没必要把数组进行截取,只需要使用几个变量分别记录下前序和中序数组的区间范围即可。因为我们是根据前序数组中的元素在中序数组中的位置来划分中序数组的,所以这里只需要记录中序数组的范围,前序数组只需要记录起始位置即可。JAVA:publicTreeNodebuildTree(int[]preorder/int[]inorder){//为了方便后续进行查找,先把中序数组的所有值存储到map中Map</Integer/Integer>/map=newHashMap</>/()/intlength=inorder/length/for(inti=0/i</length/i++)map/put(inorder[i]/i)/returnbuild(preorder/map/0/0/length-1)/}privateTreeNodebuild(int[]preorder/Map</Integer/Integer>/map/intpreStart/intinStart/intinEnd){if(inStart>/inEnd)returnnull///表示数组被访问完了。//使用前序数组的第一个元素创建根节点TreeNoderoot=newTreeNode(preorder[preStart])///查找根节点在中序数组中位置intindex=map/get(root/val)/intleftCount=index-inStart///左子树的所有节点个数//前序数组区间划分://[preStart/preStart]根节点//[preStart+1/preStart+leftCount]左子树//[preStart+leftCount+1/……]右子树//中序数组区间划分://[inStart/index-1]左子树//[index/index]根节点//[index+1/inEnd]右子树root/left=build(preorder/map/preStart+1/inStart/index-1)/root/right=build(preorder/map/preStart+leftCount+1/index+1/inEnd)/returnroot/}C++:public/TreeNode*buildTree(vector</int>/&/preorder/vector</int>/&/inorder){//为了方便后续进行查找,先把中序数组的所有值存储到map中unordered_map</int/int>/m/intlength=inorder/size()/for(inti=0/i</length/i++)m[inorder[i]]=i/returnbuild(preorder/m/0/0/length-1)/}TreeNode*build(vector</int>/&/preorder/unordered_map</int/int>/&/m/intpreStart/intinStart/intinEnd){if(inStart>/inEnd)returnnullptr///表示数组被访问完了。//使用前序数组的第一个元素创建根节点TreeNode*root=newTreeNode(preorder[preStart])///查找根节点在中序数组中位置intindex=m[root->/val]/intleftCount=index-inStart///左子树的所有节点个数//前序数组区间划分://[preStart/preStart]根节点//[preStart+1/preStart+leftCount]左子树//[preStart+leftCount+1/……]右子树//中序数组区间划分://[inStart/index-1]左子树//[index/index]根节点//[index+1/inEnd]右子树root->/left=build(preorder/m/preStart+1/inStart/index-1)/root->/right=build(preorder/m/preStart+leftCount+1/index+1/inEnd)/returnroot/}C:typedefstruct{intkey/intval/UT_hash_handlehh/}hashTable/hashTable*hashtable=NULL/hashTable*find(intikey){hashTable*pEntry/HASH_FIND_INT(hashtable/&/ikey/pEntry)/returnpEntry/}voidinsert(intikey/intival){hashTable*pEntry=malloc(sizeof(hashTable))/pEntry->/key=ikey/pEntry->/val=ival/HASH_ADD_INT(hashtable/key/pEntry)/}voidhashFree(){hashTable*cur=NULL/*tmp=NULL/HASH_ITER(hh/hashtable/cur/tmp){HASH_DEL(hashtable/cur)/free(cur)/}}structTreeNode*build(int*preorder/intpreStart/intinStart/intinEnd){if(inStart>/inEnd)returnNULL///表示数组被访问完了。//使用前序数组的第一个元素创建根节点structTreeNode*root=malloc(sizeof(structTreeNode))/root->/val=preorder[preStart]///查找根节点在中序数组中位置intindex=find(root->/val)->/val/intleftCount=index-inStart///左子树的所有节点个数//前序数组区间划分://[preStart/preStart]根节点//[preStart+1/preStart+leftCount]左子树//[preStart+leftCount+1/……]右子树//中序数组区间划分://[inStart/index-1]左子树//[index/index]根节点//[index+1/inEnd]右子树root->/left=build(preorder/preStart+1/inStart/index-1)/root->/right=build(preorder/preStart+leftCount+1/index+1/inEnd)/returnroot/}structTreeNode*buildTree(int*preorder/intpreorderSize/int*inorder/intinorderSize){//为了方便后续进行查找,先把中序数组的所有值存储到map中for(inti=0/i</preorderSize/i++)insert(inorder[i]/i)/structTreeNode*ans=build(preorder/0/0/preorderSize-1)/hashFree()///释放内存,否则会出现内存溢出returnans/}Python:defbuildTree(self/preorder/List[int]/inorder/List[int])->/Optional[TreeNode]/defbuild(preStart/int/inStart/int/inEnd/int)/ifinStart>/inEnd/returnNone#表示数组被访问完了。#使用前序数组的第一个元素创建根节点root=TreeNode(preorder[preStart])#查找根节点在中序数组中位置index=m[root/val]leftCount=index-inStart#左子树的所有节点个数 前序数组区间划分:[preStart/preStart]根节点[preStart+1/preStart+leftCount]左子树[preStart+leftCount+1/……]右子树中序数组区间划分:[inStart/index-1]左子树[index/index]根节点[index+1/inEnd]右子树 root/left=build(preStart+1/inStart/index-1)root/right=build(preStart+leftCount+1/index+1/inEnd)returnroot#为了方便后续进行查找,先把中序数组的所有值存储到map中m={element/ifori/elementinenumerate(inorder)}returnbuild(0/0/len(preorder)-1)笔者简介博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。
  • 我的新书《算法秘籍》出版了。

  • 为啥互联网公司里很少有山东大学的?

  • 那些年薪80-100万,35岁的互联网人,后来都去干嘛了?

免责声明:
1. 《真是太凡尔赛了!贵州一女研究生,被省烟草局提前录取了...》内容来源于互联网,版权归原著者或相关公司所有。
2. 若《86561825文库网》收录的文本内容侵犯了您的权益或隐私,请立即通知我们删除。