算法-二叉树篇14-从中序与后序遍历序列构造二叉树

server/2025/3/1 14:50:08/

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

力扣题目链接

题目描述

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

解题思路

这道题很有难度,如果是从中序后序遍历去构造二叉树,还是很简单的,但是用代码取实现在思路上就很绕。

首先我们先来解决如何构造这个二叉树的逻辑:

  • 对于给定中序和后序遍历或者前序和中序遍历序列构造二叉树,最重要的是这个中序遍历序列,因为中序可以分割二叉树的左右子树;
  • 那么这里我们需要的是后序序列先确定该序列的根节点,然后在中序序列中去寻找这个节点,然后分割出左右子树;
  • 根据分割的左右序列的长度,我们可以确定后序遍历序列的左右子树位置及长度;
  • 把这些分割好的左右子树的中序和后序序列传入函数重复上述的操作即可。

上述思路如果不理解可以先去自行搜索二叉树相关的文章学习二叉树的基本知识。
在代码书写上,我们需要注意以下几点:

  • 递归的使用最重要的就是,我们确定好函数的传入参数以及返回值,这里我们需要的就是中序和后序的序列作为参数,对于每个子树的构造来说都是足够的。而返回值的选择自然是一个树节点的指针,用于返回该节点作为根节点的子树;
  • 合理分割遍历序列,才能保证子树的正确构造。在这里我们需要把序列根据左右子树给分割开,那么我们就需要声明几个新的数组变量来分别存储左右子树的中后序列然后传入函数,接受作为子树;

题解

class Solution {TreeNode* func(vector<int>& inorder, vector<int>& postorder){if(postorder.size() == 0){return NULL;}int num = postorder[postorder.size() - 1];TreeNode* root = new TreeNode(num);if(postorder.size() == 1){return root;}int p1;for(p1 = 0; p1 < postorder.size(); p1++){if(inorder[p1] == num) {break;}}vector<int> leftInorder(inorder.begin(), inorder.begin() + p1);vector<int> rightInorder(inorder.begin() + p1 + 1, inorder.end());postorder.resize(postorder.size() - 1);vector<int> leftPostorder(postorder.begin(), postorder.begin() + p1);vector<int> rightPostorder(postorder.begin() + p1, postorder.end());root->left = func(leftInorder, leftPostorder);root->right = func(rightInorder, rightPostorder);return root; } public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if(inorder.size() == 0 || postorder.size() == 0){return NULL;}return func(inorder, postorder);}
};

总结

这道题目在思路上不难想到,主要是对于分割序列的左右边界需要多加留意。


http://www.ppmy.cn/server/171567.html

相关文章

Day11 洛谷题第一阶段总结

给大家看一下上面的是我上一个阶段所写的&#xff0c;因为我要准备校赛&#xff0c;蓝桥杯&#xff0c;所以我写的这些题目&#xff0c;我打算在4.12号之前写完60道题&#xff0c;最近这几天其实我心情不是很美丽&#xff0c;因为我觉得真的好辛苦啊&#xff0c; 主要还得是因…

蓝桥杯(握手问题)

小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人&#xff0c;这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外的…

苹果iPhone 17 Pro系列将配备12GB内存,AI功能成升级关键

在科技飞速发展的当下,智能手机市场的竞争愈发激烈,各大品牌都在不断推陈出新,力求在技术与用户体验上实现突破。其中,苹果公司的iPhone系列一直备受全球消费者的关注与期待。近期,有关iPhone 17 Pro系列的爆料引发了广泛热议,其中最为引人注目的便是其将配备12GB内存,这…

FFmpeg入门:最简单的视频播放器

FFmpeg入门&#xff1a;最简单的视频播放器 FFmpeg入门第一篇&#xff0c;制作一个简单的MP4视频播放器。 整体流程 话不多说&#xff0c;直接上流程图 视频播放速率控制 这里可以直接看图中的帧率同步模块&#xff0c;可以分为如下几步 获取到当前帧的预期播放时间&…

【无人集群系列---无人机集群编队算法】

【无人集群系列---无人机集群编队算法】 一、核心目标二、主流编队控制方法1. 领航-跟随法&#xff08;Leader-Follower&#xff09;2. 虚拟结构法&#xff08;Virtual Structure&#xff09;3. 行为法&#xff08;Behavior-Based&#xff09;4. 人工势场法&#xff08;Artific…

代理服务器与内网穿透/打洞

内网穿透 简单来说内网穿透就是让一个在私人IP的设备&#xff0c;能在公网上被别的主机访问到资源。 中间经过服务器将获取的数据转发给主机。 内网打洞 内网打洞&#xff0c;也叫 P2P 穿透或 NAT 穿越&#xff0c;是一种用于实现位于不同内网中的设备之间直接建立连接的技…

DeepSeek【部署 02】Linux本地化部署及SpringBoot2.X集成Ollama

安装资源分享&#xff1a; 百度网盘链接: https://pan.baidu.com/s/17qK0Nx73bFOsicLgLmA8-A?pwdtc61 提取码: tc61 包含文件&#xff1a; Windows OllamaStep.exe&#xff08;版本 0.5.7&#xff09;Linux ollama-linux-amd64-039.tgz&#xff08;版本 0.3.9&#xff09;Lin…

广州4399游戏25届春招游戏策划管培生内推

【热招岗位】 游戏策划管培生、产品培训生、游戏文案策划、游戏数值策划、游戏系统策划、游戏产品运营、游戏战斗策划、游戏关卡策划 【其他岗位】产品类&#xff08;产品培训生、产品运营等&#xff09;、技术类&#xff08;开发、测试、算法、运维等&#xff09;、运营市场类…