网易首页 > 网易号 > 正文 申请入驻

小米回复我了,白激动一场。。。

0
分享至

专栏:50多种数据结构彻底征服

专栏:50多种经典图论算法全部掌握

秋招已经接近尾声,互联网大厂目前就了,据说有的开的比要的还多,除了美团其他大厂都还没开奖。校招对于即将毕业的大学生或者研究生来说是非常重要的,如果错过了,到毕业之后就只能参加社招了,这个难度要比校招大的多,所以即将毕业的学生一定要把握住。

最近一网友在投递小米岗位的时候被告知发错信息了,这个有可能是真的发错了,也有可能是招聘关闭了,所以在毕业之前就尽量把工作找好。

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

来看下今天的算法题,这题是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:

public TreeNode buildTree(int[] preorder, int[] inorder) {     // 为了方便后续进行查找,先把中序数组的所有值存储到map中     Map
         
  map =  new HashMap<>();      int length = inorder.length;      for ( int i =  0; i < length; i++)         map.put(inorder[i], i);      return build(preorder, map,  0,  0, length -  1); } private TreeNode build(int[] preorder, Map  map,                         int preStart,  int inStart,  int inEnd)  {      if (inStart > inEnd)  return  null; // 表示数组被访问完了。      // 使用前序数组的第一个元素创建根节点     TreeNode root =  new TreeNode(preorder[preStart]);      // 查找根节点在中序数组中位置      int index = map.get(root.val);      int leftCount = 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);      return root; }

C++:

public:     TreeNode *buildTree(vector

  &preorder, vector

  &inorder) {         // 为了方便后续进行查找,先把中序数组的所有值存储到map中         unordered_map

  m;         int length = inorder.size();         for (int i = 0; i < length; i++)             m[inorder[i]] = i;         return build(preorder, m, 0, 0, length - 1);     }     TreeNode *build(vector

  &preorder, unordered_map

  &m,                     int preStart, int inStart, int inEnd) {         if (inStart > inEnd)             return nullptr;// 表示数组被访问完了。         // 使用前序数组的第一个元素创建根节点         TreeNode *root = new TreeNode(preorder[preStart]);         // 查找根节点在中序数组中位置         int index = m[root->val];         int leftCount = 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);         return root;     }





Python:

def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:     def build(preStart: int, inStart: int, inEnd: int):         if inStart > inEnd:             return None  # 表示数组被访问完了。         # 使用前序数组的第一个元素创建根节点         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)         return root     # 为了方便后续进行查找,先把中序数组的所有值存储到map中     m = {element: i for i, element in enumerate(inorder)}     return build(0, 0, len(preorder) - 1)

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
内娱最干净的低谷重生,黄海波蛰伏十二载,平凡生活终得圆满

内娱最干净的低谷重生,黄海波蛰伏十二载,平凡生活终得圆满

子芫伴你成长
2026-06-25 00:05:10
清风北京:3人被查,朝阳1人!

清风北京:3人被查,朝阳1人!

家住朝阳
2026-06-24 21:13:18
TA:皇马将采用4231阵型,巴尔韦德不会离队、穆帅优先目标恩佐

TA:皇马将采用4231阵型,巴尔韦德不会离队、穆帅优先目标恩佐

砚底沉香
2026-06-24 17:14:02
孙正义最新重磅演讲:AI没泡沫,叫板马斯克,称太空数据中心没价值

孙正义最新重磅演讲:AI没泡沫,叫板马斯克,称太空数据中心没价值

华尔街见闻官方
2026-06-24 22:27:38
CBA:广厦仁至义尽却陷两难,朱俊龙顶薪或无缘,200万谈崩赵岩昊

CBA:广厦仁至义尽却陷两难,朱俊龙顶薪或无缘,200万谈崩赵岩昊

体坛侃排球
2026-06-24 11:45:54
一句狠话戳穿千年讽刺:莫斯科开山老祖,尸骨埋在基辅圣地

一句狠话戳穿千年讽刺:莫斯科开山老祖,尸骨埋在基辅圣地

老马拉车莫少装
2026-06-16 19:31:37
法拉利首款电车Luce:435万的“苹果味”法拉利,值吗?

法拉利首款电车Luce:435万的“苹果味”法拉利,值吗?

小南看车
2026-05-26 11:06:56
美股盘前要闻一览:美光科技今夜迎“大考”;SK海力士寻求7月10日开始ADR交易;英伟达举行年度股东大会

美股盘前要闻一览:美光科技今夜迎“大考”;SK海力士寻求7月10日开始ADR交易;英伟达举行年度股东大会

财联社
2026-06-24 21:11:37
涉嫌严重违纪违法,陈建宏被查

涉嫌严重违纪违法,陈建宏被查

中国基金报
2026-06-23 14:43:48
2TB固态硬盘白菜价 三星西数闭眼入的时机到了

2TB固态硬盘白菜价 三星西数闭眼入的时机到了

闪存猎手
2026-06-23 01:27:18
史上最大一笔!字节跳动,要在海外借1361亿

史上最大一笔!字节跳动,要在海外借1361亿

财通社
2026-06-24 20:17:03
乌兹足协副主席:一年级打不过九年级,葡萄牙未来会惧怕我们

乌兹足协副主席:一年级打不过九年级,葡萄牙未来会惧怕我们

懂球帝
2026-06-24 14:52:09
菲律宾政坛大地震!新议长被指用弹劾莎拉当挡箭牌,掩盖百亿黑钱

菲律宾政坛大地震!新议长被指用弹劾莎拉当挡箭牌,掩盖百亿黑钱

誮惜颜a
2026-06-23 21:25:27
2026高考450-560分,推荐报考这8所宝藏大学,就业极强!

2026高考450-560分,推荐报考这8所宝藏大学,就业极强!

高三倒计时
2026-06-23 18:18:49
“坚决不招暑假工!”女老板吐槽火了,大学生的反应证明她说的对

“坚决不招暑假工!”女老板吐槽火了,大学生的反应证明她说的对

林林先生
2026-06-22 10:18:06
7月3日油价将迎大幅下调 每吨预计降幅630元

7月3日油价将迎大幅下调 每吨预计降幅630元

蚌埠日报
2026-06-22 10:59:17
史无前例!特朗普在接受采访时透露,中美两国可能实现1年4次会面

史无前例!特朗普在接受采访时透露,中美两国可能实现1年4次会面

墨兰史书
2026-06-23 12:15:09
花一次钱,永久买断Windows和Office,这种安全感谁不爱?

花一次钱,永久买断Windows和Office,这种安全感谁不爱?

半勺甜心事
2026-06-24 00:18:22
7月1日,你的账户将多一笔额外收入!

7月1日,你的账户将多一笔额外收入!

阜阳发布
2026-06-23 10:42:52
这次,俞灏明苦苦维持的体面,被王晓晨撕的稀碎,郑恺早有提醒

这次,俞灏明苦苦维持的体面,被王晓晨撕的稀碎,郑恺早有提醒

打小我就醜
2026-06-04 12:37:40
2026-06-25 01:35:00
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
273文章数 4关注度
往期回顾 全部

科技要闻

豆包专业版上线:定价68-500元每月

头条要闻

谢锋当众质问巴拿马:若契约想撕毁就撕毁 谁还来投资

头条要闻

谢锋当众质问巴拿马:若契约想撕毁就撕毁 谁还来投资

体育要闻

字母哥,会把凯尔特人拆了吗?

娱乐要闻

向佐向佑兄弟合体直播!母子终于和解

财经要闻

逃税23亿:审计署年报直指七家机构

汽车要闻

施鹏泽:为什么奥迪E7X强调座舱气味安全?

态度原创

本地
教育
旅游
数码
公开课

本地新闻

2026世界杯全勤太难?这份保姆级攻略请收好

教育要闻

冲线之后·为了在一起 | 换我们提前上场,守住在一起的权利

旅游要闻

游昆明黑龙潭别错过,四百年临水古阁,藏一户普通人的忠义悲歌!

数码要闻

影石回应Luna Ultra“骗国补”质疑:不存在骗补,系品牌补贴与政策落地差异

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版