当前位置: 首页 > news >正文

面试经典 106. 从中序与后序遍历序列构造二叉树

  • 最近小胖开始找工作了,又来刷苦逼的算法了 555

  • 废话不多说,看这一题,上链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envType=study-plan-v2&envId=top-interview-150
    在这里插入图片描述

  • 看到这一题有两个很重要的基础知识点需要知道

    • 什么是二叉树?
    • 什么是中序遍历和后序遍历?
  • 先回答第一个问题,什么是二叉树?这是一个数据结构,是一种常见的树状数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点,如上图。

  • 了解什么是二叉树,才能回答第二问题,什么是中序遍历和后序遍历?首先这两个都是一种遍历整个二叉树的方法,只不过遍历节点的顺序不同产生不同的名字

    • 中序遍历:按照左子树 -> 根节点 -> 右子树的顺序遍历二叉树
    • 后序遍历:按照左子树 -> 右子树 -> 根节点的顺序遍历二叉树
  • 好了,了解了这两个基础知识,现在就来解决这道题。这道题的核心在于你拥有两个顺序的方式,如何构建一棵树呢?

  • 从上面例子入手,后序遍历是 9,15,7,20,3,我们知道后序遍历的顺序是 左,右,根,所以左右一个元素肯定是根节点,这棵树的根节点就是 3 。

  • 得到了这个信息有什么用呢?用处大了,我们可以拿这个 3 去中序遍历找 左子树的范围 和 右子树的范围,如下图:
    在这里插入图片描述

  • 这样子我们是不是就把左子树和右子树的范围找出来了呢,所以这个过程的逻辑就是这样的:

    • 先获取后序遍历数组的最后一个元素,得到根节点
    • 再根据根节点 去 中序遍历数组中寻找对应的位置
    • 找到位置 i 后,开始圈定范围
    • 左子树 元素范围是 0 - i
    • 右子树 元素范围是 i+1 - n(数组的最后一个元素)
  • 找到范围了,然后咋办呢?

  • 这个时候就需要一个很牛逼的思想,分治的思想

  • 什么是分治?分治就是一种问题解决策略,它将一个大问题划分为多个相同或类似的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到大问题的解。

  • 所以这里我们可以将找出的 左子树 当作一个新的树,继续上述的操作,直到只剩一个节点为止,就如上述的 9 节点。右子树同理

  • 这样我们的二叉树就可以完成了,具体代码如下:

func dfs106(inorder []int, postorder []int) *TreeNode {//当中序数组为空,则没有元素,返回nilif len(inorder) == 0 {return nil}//根节点为后序数组的最后一个元素head := &TreeNode{Val: postorder[len(postorder)-1]}//在中序数组中找到根节点的位置i := 0for ; i < len(inorder); i++ {if inorder[i] == postorder[len(postorder)-1] {break}}//递归构建 左子树head.Left = dfs106(inorder[:i], postorder[:i])//递归构建 右子树head.Right = dfs106(inorder[i+1:], postorder[i:len(postorder)-1])//返回根节点return head
}
  • 这里可以有个小优化,因为每次递归都需要遍历 中序数组,太过耗时了,本着空间换时间的策略,用一个 map 存储每个中序数组元素的索引,这样查找 左右子树的范围的时候就会快很多,代码如下:
func Solution106v2(inorder []int, postorder []int) *TreeNode {// 获取中序遍历的索引n := len(inorder)index := make(map[int]int, n)for i, v := range inorder {index[v] = i}var build func(int, int, int, int) *TreeNodebuild = func(p1, p2, i1, i2 int) *TreeNode {// 递归终止条件if p1 > p2 {return nil}// 根节点root := &TreeNode{Val: postorder[p2]}// 中序遍历中根节点的位置i := index[postorder[p2]]// 左子树的节点个数leftSize := i - i1// 递归构建左右子树root.Left = build(p1, p1+leftSize-1, i1, i-1)root.Right = build(p1+leftSize, p2-1, i+1, i2)return root}return build(0, n-1, 0, n-1)}
  • 到这里就结束了,这道题写了我足足一个上午,看来还是太菜了需要多练,不说了接着做题了

相关文章:

面试经典 106. 从中序与后序遍历序列构造二叉树

最近小胖开始找工作了&#xff0c;又来刷苦逼的算法了 555 废话不多说&#xff0c;看这一题&#xff0c;上链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-inte…...

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 问题概述 📒📒 解决方案 📒🔖 方法一🔖 方法二🔖 方法三⚓️ 相关链接 🚓️📖 介绍 📖 在群晖(Synology)NAS设备上使用Docker时,我们可能会遇到查询Docker注册表失败,无法拉取Docker镜像的问题。这种情况…...

【Scrapy】 深入了解 Scrapy 中间件中的 process_spider_input 方法

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…...

数据库MySQL---基础篇

存储和管理数据的仓库 MySQL概述 数据库相关概念 数据库&#xff08;DataBase&#xff09;---数据存储的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff08;DBMS&#xff09;-----操纵和管理数据库的大型软件 SQL----操作关系型数据库的编程语言&#xff…...

欧姆龙安全PLC及周边产品要点指南

电气安全、自动化设备作业安全&#xff0c;向来是非常非常之重要的&#xff01;越来越多的客户在规划新产线、改造既有产线的过程中&#xff0c;明确要求设计方和施工方将安全考虑进整体方案中进行考虑和报价&#xff01;作为一名自动化电气工程师&#xff0c;尤其是高级工程师…...

tableau气泡图与词云图绘制 - 8

气泡图及词云图绘制 1. 气泡图绘制1.1 选择相关属性字段1.2 选择气泡图1.3 设置颜色1.4 设置标签1.5 设置单位 2. 气泡图绘制 - 22.1 类别筛选2.2 页面年份获取2.3 行列获取2.4 历史轨迹显示 3. 词云图绘制3.1 筛选器3.2 选择相关属性3.3 选择气泡图3.4 设置类型颜色3.5 设置形…...

C语言 找出一个二维数组中的鞍点

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 #include <stdio.h>int main() {int matrix[4][4] {{10, 17, 13, 28},{21, 14, 16, 40},{30, 42, 23, 39},{24, 11, 19, 17}};int n 4, m 4;int found 0;for (int i 0; i …...

【笔记】在linux中设置错文件如何重置

以mysql的auto.cnf文件为例...

DNS中的CNAME与A记录:为什么无法共存A解析和C解析?

在互联网的世界中&#xff0c;DNS&#xff08;域名系统&#xff09;扮演着至关重要的角色&#xff0c;它将易于记忆的域名转换为计算机可识别的IP地址。在这个过程中&#xff0c;两种常见的DNS记录类型——CNAME记录和A记录——经常被提及。然而&#xff0c;它们之间存在着一些…...

线程和进程

文章目录 进程和线程进程线程案例 时间片概念调度方式线程的创建和启动第一种创建方式第二种创建方式&#xff08;匿名内部类&#xff09;第三种创建方式&#xff08;Runnable接口&#xff09;main线程和t线程之间的关系 线程的名字线程的优先级线程状态 进程和线程 进程 在计…...

【JavaEE】 简单认识CPU

&#x1f435;本篇文章将对cpu的相关知识进行讲解 一、认识CPU 下图是简略的冯诺依曼体系结构图 上图中&#xff0c;存储器用来存储数据&#xff0c;注意在存储器中都是以二进制的形式存储数据的&#xff0c;CPU就是中央处理器&#xff0c;其功能主要是进行各种算术运算和各种…...

《数字图像处理-OpenCV/Python》第17章:图像的特征描述

《数字图像处理-OpenCV/Python》第17章&#xff1a;图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第17章&#xff1a;图像的特征描述 特征检测与匹配是计算机视觉的…...

考研数学什么时候开始强化?如何保证进度不掉队?

晚了。我是实在人&#xff0c;不给你胡乱吹&#xff0c;虽然晚了&#xff0c;但相信我&#xff0c;还有的救。 实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张... 中间基本没有试错的时间&#xff0c;让你换…...

Node.js的下载、安装和配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

java.util.Properties类介绍

java.util.Properties 是 Java 编程语言中的一个类,用于管理应用程序的配置信息,它继承自 java.util.Hashtable 类,因此它也是基于键值对的数据结构。主要用途是存储应用程序的配置参数,比如数据库连接信息、用户设置等。 以下是 Properties 类的一些主要特点和用法: 存储…...

SpringBoot后端验证码-防止密码爆破功能

一、简介 为了防止网站的用户被通过密码典爆破。引入验证码的功能是十分有必要的。而前端的验证码又仅仅是只防君子不防小人。通过burpsuit等工具很容易就会被绕过。所以后端实现的验证码才是对用户信息安全的一大重要保障。 实现思路&#xff1a; 1.引入图形生成的依赖 2.生成…...

ChatEval:通过多代理辩论提升LLM文本评估质量

论文地址:ChatEval: Towards Better LLM-based Evaluators through Multi-Agent Debate | OpenReviewText evaluation has historically posed significant challenges, often demanding substantial labor and time cost. With the emergence of large language models (LLMs…...

关于美国服务器IP的几个常见问题

在租用美国服务器时&#xff0c;与之密切相关的一个要素就是IP&#xff0c;关于IP的问题总是有人问起&#xff0c;这里列举几项常见的问题&#xff0c;以供参考。 一、IP收费吗&#xff1f; 一般情况下&#xff0c;在租用服务器时&#xff0c;会赠送几个IP&#xff0c;因为这些…...

redis运维:sentinel模式如何查看所有从节点

1. 连接到sentinel redis-cli -h sentinel_host -p sentinel_port如&#xff1a; redis-cli -h {域名} -p 200182. 发现Redis主服务器 连接到哨兵后&#xff0c;我们可以使用SENTINEL get-master-addr-by-name命令来获取当前的Redis主服务器的地址。 SENTINEL get-master-a…...

价格疑云?格行WiFi创始人亲解谜团,性价比之王如何炼成?

随身wifi行业乱象频出&#xff0c;作为行业领跑品牌的格行随身wifi&#xff0c;关于价格问题一直备受质疑。关于设备上的“格行自有格行的骄傲”也被外界认定为是自大&#xff0c;甚至发展的线下一万多家门店也被同行不认可。近日&#xff0c;企业财经专访记者有幸采访了格行随…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...