10-树-从中序与后序遍历序列构造二叉树

这是树的第10篇算法,力扣链接。

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

回忆一下中序遍历和后序遍历。

中序遍历 (Inorder Traversal)

在中序遍历中,我们按照以下顺序遍历树中的节点:

  1. 遍历左子树
  2. 访问根节点
  3. 遍历右子树

对于二叉搜索树(BST),中序遍历会按照升序访问所有节点,因为二叉搜索树的特点是左子节点的值小于根节点的值,根节点的值小于右子节点的值。

后序遍历 (Postorder Traversal)

后序遍历的顺序是:

  1. 遍历左子树
  2. 遍历右子树
  3. 访问根节点

后序遍历常用于删除或释放树中的节点。因为你在删除节点之前先访问其子节点,这样可以安全地删除每个节点。

假设有一棵二叉树如下:

    A/ \B   C/ \   \
D   E   F

对这棵树进行不同的遍历会得到以下结果:

  • 中序遍历D, B, E, A, C, F。首先遍历左子树(D, B, E),然后是根节点(A),最后是右子树(C, F)。
  • 后序遍历D, E, B, F, C, A。首先是左子树(D, E, B),然后是右子树(F, C),最后是根节点(A)。

这道题和上一篇算法的前序遍历类似,这不过这里的后序遍历涉及到一定的逆逻辑,例如根节点是最后一个节点,右子树的范围到 len(postorder)-1-len(inorder[index+1:])

func buildTree(inorder []int, postorder []int) *TreeNode {if len(postorder) == 0 {return nil}index := 0for ; index < len(inorder); index++ {if inorder[index] == postorder[len(postorder)-1] {break}}result := &TreeNode{Val: postorder[len(postorder)-1]}result.Right = buildTree(inorder[index+1:], postorder[len(postorder)-1-len(inorder[index+1:]):len(postorder)-1])result.Left = buildTree(inorder[:index], postorder[:len(postorder)-1-len(inorder[index+1:])])return result
}

当然,也可以试试迭代的方法。

func buildTree(inorder []int, postorder []int) *TreeNode {if len(postorder) == 0 {return nil}result := &TreeNode{Val: postorder[len(postorder)-1]}stack := []*TreeNode{result}inorderIndex := len(inorder) - 1for i := len(postorder) - 2; i >= 0; i-- {node := stack[len(stack)-1]if node.Val != inorder[inorderIndex] {node.Right = &TreeNode{Val: postorder[i]}stack = append(stack, node.Right)} else {for len(stack) > 0 && stack[len(stack)-1].Val == inorder[inorderIndex] {node = stack[len(stack)-1]stack = stack[:len(stack)-1]inorderIndex--}node.Left = &TreeNode{Val: postorder[i]}stack = append(stack, node.Left)}}return result
}

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

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

相关文章

WebAssembly002 FFmpegWasmLocalServer项目

项目介绍 https://github.com/incubated-geek-cc/FFmpegWasmLocalServer.git可将音频或视频文件转换为其他可选的多媒体格式&#xff0c;并导出转码的结果 $ bash run.sh FFmpeg App is listening on port 3000!运行效果 相关依赖 Error: Cannot find module ‘express’ …

MybatisPlus Wrapper构造器(查询篇)

笔记&#xff1a;* 依赖MybatisPlus 3.5.5* 自动映射&#xff1a;a) 表名和实体类的映射 -> t_stu 表 Student 实体类:1.当表名和实体类名不一样的时候再实体类类名上加上TableName注解TableName("t_stu")2.也可以在配置文件中配置数据库表名的前缀&#xff0c;配…

由vscode自动升级导致的“终端可以ssh服务器,但是vscode无法连接服务器”

问题描述 简单来说就是&#xff0c;ssh配置没动&#xff0c;前两天还可以用vscode连接服务器&#xff0c;今天突然就连不上了&#xff0c;但是用本地终端ssh可以顺利连接。 连接情况 我的ssh配置如下&#xff1a; Host gpu3HostName aaaUser zwx现在直接在终端中进行ssh&am…

ElastAlert 错误日志告警

文章目录 前言一、ElastAlert 概览1.1 简介1.2 ElastAlert 特性 二、ElastAlert 下载部署2.1 安装 Python3 环境2.2 下载 ElastAlert2.3 部署 ElastAlert 三、接入平台3.1 对外接口层3.2 服务层 前言 ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件&#xff0c;…

Stata学习(1)

一、五大窗口 Command窗口&#xff1a;实现人机交互 来导入一个自带数据&#xff1a; sysuse是导入系统自带的数据&#xff0c;auto导入该数据的名称&#xff0c;后面的clear是清除之前的数据 结果窗口&#xff1a;展示计算结果、查找功能 在Edit的find可以实现查找功能&#…

(30)数组元素和与数字和的绝对差

文章目录 每日一言题目解题思路代码结语 每日一言 书籍便是这种改造灵魂的工具。人类所需要的&#xff0c;是富有启发性的养料。而阅读&#xff0c;则正是这种养料。——雨果 题目 题目链接&#xff1a;数组元素和与数字和的绝对差 给你一个正整数数组 nums 。 元素和 是 n…

Nacos安装,服务注册,负载均衡配置,权重配置以及环境隔离

1. 安装 首先从官网下载 nacos 安装包&#xff0c;注意是下载 nacos-server Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 下载完毕后&#xff0c;解压找到文件夹bin&#xff0c;文本打开startup.cmd 修改配置如下 然后双击 startup.cmd 启动 nacos服务&#xff0c;默认…

帕金森病的主要原因是什么?

帕金森病的主要原因目前尚不完全清楚&#xff0c;但多种因素可能与其发病有关。 首先&#xff0c;遗传因素是一个重要的影响因素。临床研究和统计数据显示&#xff0c;约有10%的帕金森病患者存在家族史&#xff0c;这表明遗传因素在帕金森病发病中起着重要作用。一些家族研究显…

【经验分享】如何高效管理Jmeter的接口测试用例?

Test Fragment 测试片段元素是控制器上的一个种特殊的线程组&#xff0c;它在测试树上与线程组处于一个层级。它与线程组有所不同&#xff0c;它不被执行&#xff0c;当它是一个模块控制器或者是被控制器所引用时才会被执行 添加Test Fragment的步骤&#xff1a; 目前接口的组…

深入理解C#中的事件驱动编程

深入理解C#中的事件驱动编程 在现代软件开发中&#xff0c;事件驱动编程是一种常见且强大的范式&#xff0c;它允许不同的系统组件以松耦合的方式进行交互。特别是在C#中&#xff0c;事件是实现这种编程范式的核心机制之一。本文将深入探讨C#中的事件&#xff0c;包括它们的定…

微信小程序的图片色彩分析,窃取主色调,调色板

1、在微信小程序中创建包管理器 package.json npm init -y 2、安装 Mini App Color Thief 包 npm i --save miniapp-color-thief 3、构建 npm 4、wxml <canvas canvas-id"myCanvas"></canvas> <button bindtap"chooseImage">chooseIm…

MATLAB语音去噪系统

目录 一、背景 二、GUI页面 三、程序 3.1 LMS滤波程序 3.2 GUI程序 四、附录 一、背景 本文介绍了一种最佳的自适应滤波器结构&#xff0c;该结构采用最小均方差&#xff08;LMS&#xff09;作为判据&#xff0c;通过不断迭代自适应结构来调整得到最佳滤波器…

如何使用 Python 3 中的 Requests 和 Beautiful Soup 处理 Web 数据

简介 网络为我们提供了比我们能阅读和理解的更多数据&#xff0c;因此我们经常希望以编程方式处理这些信息&#xff0c;以便理解它。有时&#xff0c;网站创建者通过 .csv 或逗号分隔值文件或通过 API&#xff08;应用程序编程接口&#xff09;向我们提供这些数据。其他时候&a…

.net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken

在VB.NET中&#xff0c;您可以使用Newtonsoft.Json程序包来处理JSON数据。为了方便获取多级JSON数据&#xff0c;您可以使用JObject类的SelectToken方法。以下是一个示例代码&#xff1a; Imports Newtonsoft.Json Imports Newtonsoft.Json.LinqPublic Sub Main()Dim jsonStrin…

前端常用代码整理(不断更新中)— js,jquery篇

1.随机函数代码 function getRandom(min, max) {return Math.floor(Math.random() * (max - min 1)) min}2.倒计时代码 let now new Date()// 2. 得到指定时间的时间戳let last new Date(这里写想要达到的时间)// 3. &#xff08;计算剩余的毫秒数&#xff09; / 1000 剩余…

【Linux】缓冲区与缓冲区的刷新策略

目录 1.缓冲区基础 1.1缓冲区的刷新策略 1.1.1三种刷新策略 1.1.2.两种强制刷新策略 2.用户级语言层缓冲区 2.1.默认在显示器输出 2.2.重定向到文件输出 2.3.write调用没有显示两份的原因 3.模拟实现文件缓冲区 3.1 myFileBuffer.h 3.2 myFileBuffer.c 4.系统内核缓…

Linux操作系统运维-Docker的基础知识梳理总结

Linux操作系统运维-Docker的基础知识梳理总结 docker用来解决不同开发人员软件调试时环境不统一的问题&#xff0c;保证了程序调试时运行环境的一致性。docker的设计理念便是一处镜像&#xff0c;处处运行&#xff0c;即通过产生用户软件&#xff0c;运行环境及其运行配置的统一…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

[C++] sqlite3_get_table 的使用

不知道为啥 sqlite3 里面使用 “UPDATE” 更新数据&#xff0c;更新失败也不报错&#xff0c;所以就想绕过去。先查一下字段存在不存在&#xff0c;然后再update std::string selectsql "SELECT COUNT(*) FROM table_name WHERE some_condition"; char** dbResult;…

Linux下centos操作系统安装Mysql8.0过程及踩坑填补

我自己有一台服务器&#xff0c;之前安装的是MySQL5.5&#xff0c;现在我想升级为MySQL8.0&#xff0c;于是我干了以下操作,既有踩坑又有干货&#xff1a; 1.先卸载MySQL&#xff1b; 2.删除跟MySQL相关文件&#xff1b; 3.安装新的MySQL8.0版本&#xff08;这里踩了一个坑&…