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

news2024/11/16 13:48:32
  • 最近小胖开始找工作了,又来刷苦逼的算法了 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 {
  //当中序数组为空,则没有元素,返回nil
  if len(inorder) == 0 {
    return nil
  }
  //根节点为后序数组的最后一个元素
  head := &TreeNode{Val: postorder[len(postorder)-1]}
  //在中序数组中找到根节点的位置
  i := 0
  for ; 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) *TreeNode
  build = 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)}
  • 到这里就结束了,这道题写了我足足一个上午,看来还是太菜了需要多练,不说了接着做题了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity】简单举例UI合批,优化draw call

1. UGUI-Editor 首先引入UGUI-Editor插件 链接: https://pan.baidu.com/s/1PpxStvgRCDi9xjUr6j6nCQ?pwdm5ju 提取码: m5ju 或者直接去Github搜索UGUI-Editor 2. 没有UI时 3. 放几个UI看看效果 4. 选中Canvas&#xff0c;右键优化Batch 发现减少了3个&#xff0c;这是因为&…

STM32智能无人机控制系统教程

目录 引言环境准备智能无人机控制系统基础代码实现&#xff1a;实现智能无人机控制系统 4.1 数据采集模块 4.2 数据处理与飞行控制 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;无人机应用与优化问题解决方案与优化收尾与总结 1. 引言 智能无人机控…

vue3创建项目

1. 安装node.js&#xff0c;添加环境变量&#xff0c;确保cmd里能使用node命令以及npm命令&#xff1a;node --version npm --version 本人安装的版本如下&#xff1a; 2. 安装vue的脚手架 npm install -g vue/cli 3. 创建vue项目&#xff1a;1&#xff09;使用ui&#xff1…

#数据结构 链表

单向链表 1. 概念 单向链表 单向循环链表 双向链表 双向循环链表 解决&#xff1a;长度固定的问题&#xff0c;插入和删除麻烦的问题 1、逻辑结构&#xff1a; 线性结构 2、存储结构&#xff1a; 链式存储 链表就是将 结点 用链串起来的线性表&#xff0c;链就是 结点 中的…

开源网页终端webssh容器镜像制作与使用

1.Dockerfile编写&#xff1a; # 指定镜像目标平台与镜像名 alpine表示基础镜像 第一层镜像 FROM --platform$TARGETPLATFORM alpine # 添加元数据到镜像 LABEL maintainer"Jrohy <euvkzxgmail.com>" # 编译时变量 ARG TARGETARCH # 执行编译命令&#xff0c;…

c#第五次作业

目录 1. 实现通用打印泛型类&#xff0c;可以打印各个集合中的值&#xff0c;方便调试 2. 计算遍历目录的耗时 3. 有哪些算术运算符&#xff0c;有哪些关系运算符&#xff0c;有哪些逻辑运算符&#xff0c;有哪些位运算符&#xff0c;有哪些赋值运算符 1&#xff09;算术运算…

我国静止无功发生器(SVG)市场规模逐渐扩大 高压SVG为主流产品

我国静止无功发生器&#xff08;SVG&#xff09;市场规模逐渐扩大 高压SVG为主流产品 静止无功发生器&#xff08;SVG&#xff09;又称为静止同步补偿器、先进静止补偿器、静止调相机等&#xff0c;是利用全控型功率器件组成的桥式变流器来实现动态无功调节的一种先进无功自动补…

医学图像分割论文:Learnable Ophthalmology SAM

文章目录 0. Abstract1. Introduction2. Learnable Ophthalmology(眼科学) SAM2.1 Preliminaries(预先)2.2 Learnable Prompt Layer3. Experiment3.1 Datasets3.2 Evaluation Metrics(指标)3.3 Implement Details3.4 Experimental Results3.5 Generalization4. Discussion5. …

【JavaWeb程序设计】JSP访问数据库(二)

目录 一、编写一个网页&#xff0c;实现根据输入学生姓名的模糊查询&#xff0c;如果查找不到就显示“查无此人” 1. 运行截图 2. 建表 3. JSP页面主要代码&#xff08;inquire.jsp&#xff09; 4. Bean实体类 5. DAO层 6. Service层&#xff08;模糊查询&#xff09; …

展厅AI数字人:实现智慧园区与数字孪生的高效交互展示

随着人工智能技术的飞速发展&#xff0c;智慧园区和数字孪生技术已经成为展厅管理和规划的重要工具&#xff0c;展厅AI数字人可以提供沉浸式的展览体验。 展厅大屏幕支持与AI数字人连接&#xff0c;用户可以直接通过语音交互的形式操作大屏幕显示的内容&#xff0c;实现对大屏…

ELFK 8.12.2 部署 -- docker部署方式⚽

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Mysql系列-Binlog主从同步

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/669450627 一、主从同步概述 mysql主从同步&#xff0c;即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主 从同步功能&#xff0c;经过配置&#xff0c;可以实现基于库、表…

如何降低亚马逊测评风险?掌握这些技巧就够了!

无论是初涉亚马逊测评领域的新手还是经验丰富的老手&#xff0c;都不可避免地会面临各种风险挑战。为了将这些风险降至最低&#xff0c;我们需掌握一系列高效且安全的测评策略。以下是一些关键的亚马逊测评技巧与策略&#xff1a; 亚马逊测评优化策略 1. 真实购买与国外账号&a…

​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​

五、IS-IS报文 1、IS-IS报文格式 IS-IS报文是直接封装在数据链路层的帧结构中的。 PDU(Protocol Data Unit&#xff0c;协议数据单元): 报文头(IS-IS Header) 变长字段(Variable Length Fields )。 IS-IS Header: 通用头部(PDU Common Header) 专用头部(PDU Specific H…

javaIO流(2)

一.字符流 字符流对数据的操作是以一个个字符为单位的,字符流只能读文本文件,并将读到的字节按照编码表转为对应的字符,Reader和Writer是字符流的两个最大的抽象类,InputStreamReader和OutputStreamWriter分别继承了Reader和Writer,它俩的功能就是将读取到的字节转换为字符,所…

实验代码结构介绍

提高模型复用性&#xff0c;让模型对应的配置更加清晰&#xff0c;代码书写条理 学习自https://zhuanlan.zhihu.com/p/409662511 Project ├── checkpoints # 存放模型 ├── data # 定义各种用于训练测试的数据集 ├── eval.py # 测试代码 ├── loss.py # 定义的…

CSS 后代选择器正确写法 爸爸儿子之间有代沟

CSS 后代选择器正确写法 爸爸儿子之间有代沟 example&#xff1a; > <body> > <div class"outer"> > <span class"inner"></span> > </div> > </body> > <head> > <style>…

如何选择快手矩阵源码:关键因素解析

在短视频行业迅速发展的今天&#xff0c;快手平台已成为众多内容创作者和企业的重要阵地。为了有效管理和运营多个快手账号&#xff0c;快手矩阵源码成为了一个关键工具。然而&#xff0c;市场上的快手矩阵源码种类繁多&#xff0c;选择一个合适的源码并非易事。本文将探讨选择…

【QT】多元素控件

多元素控件 多元素控件1. List Widget2. Table Widget3. Tree Widget 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别&#xff0c;以 QTableWidget 和 QTableView 为例&#xff1a; …

WPS提示打印机异常,但是任然可以打印

故障现象 使用WPS在打印预览页时&#xff0c;打印机有小橙点提示&#xff0c;点击打印时会报错&#xff0c;提示&#xff1a; 打印机异常&#xff0c;打印机状态出现异常&#xff0c;请检查打印机是否开机并且联机 但是点击确定后&#xff0c;可以继续打印&#xff0c;而且其他…