176.二叉树:从中序与后序遍历序列构造二叉树(力扣)

代码解决

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

class Solution {
public:
    // 递归函数,用于从中序和后序遍历序列中构建二叉树
    TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) {
        // 如果后序遍历序列为空,返回空指针
        if (postorder.size() == 0) return nullptr;

        // 获取后序遍历序列的最后一个值作为当前子树的根节点值
        int rootVal = postorder[postorder.size() - 1];
        TreeNode* root = new TreeNode(rootVal);

        // 如果后序遍历序列只有一个值,返回根节点
        if (postorder.size() == 1) return root;

        // 在中序遍历序列中找到根节点值的位置
        int delimiterIndex;
        for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {
            if (inorder[delimiterIndex] == rootVal)
                break;
        }

        // 划分左子树和右子树的中序遍历序列
        vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
        vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end());

        // 移除后序遍历序列的最后一个元素
        postorder.resize(postorder.size() - 1);

        // 划分左子树和右子树的后序遍历序列
        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
        vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());

        // 递归构建左子树和右子树
        root->left = traversal(leftInorder, leftPostorder);
        root->right = traversal(rightInorder, rightPostorder);

        // 返回构建好的根节点
        return root;
    }

    // 主函数,从中序和后序遍历序列中构建二叉树
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        // 如果中序或后序遍历序列为空,返回空指针
        if (inorder.size() == 0 || postorder.size() == 0) return nullptr;
        // 调用递归函数构建二叉树
        return traversal(inorder, postorder);
    }
};
  1. 定义一个递归函数 traversal,它接受中序遍历序列和后序遍历序列作为参数。
  2. 首先检查后序遍历序列是否为空,如果是,返回空指针。
  3. 获取后序遍历序列的最后一个值,这个值就是当前子树的根节点的值。
  4. 在中序遍历序列中找到根节点值的位置,并将其作为分隔点,将中序遍历序列划分为左子树和右子树的中序遍历序列。
  5. 移除后序遍历序列的最后一个元素,并将其作为分隔点,将后序遍历序列划分为左子树和右子树的后序遍历序列。
  6. 递归地调用 traversal 函数来构建左子树和右子树。
  7. 返回构建好的根节点。
  8. 在 buildTree 函数中,首先检查中序或后序遍历序列是否为空,如果是,返回空指针。然后调用 traversal 函数来构建二叉树。

这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是树中节点的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神卓互联内网穿透:使用超简单,拿捏

神卓互联内网穿透技术是一种能够打破内网与外网之间壁垒的创新技术。它通过一系列智能的网络协议和算法&#xff0c;实现了将企业内部网络资源安全、稳定地暴露给外部网络访问。这使得无需进行复杂的网络配置和改造&#xff0c;就能轻松实现远程办公、跨地域协作等重要应用。 神…

【第1章】Vue环境搭建

文章目录 前言一、安装Node1. 下载2. 安装3. 验证3.1 npm版本与Node.js版本3.2 验证环境 4. npm4.1 安装npm4.2 安装包4.3 全局安装包4.4 更新包4.5 删除包4.6 查看已安装的包4.7 初始化package.json 5. 国内源 二、安装Visual Studio Code1.下载2.安装3.安装Vue - Official 三…

【品质】如何培养幽默感,如何幽默的沟通与应对生活(自卑vs自信,悲观vs乐观)

【品质】如何培养幽默感&#xff0c;如何幽默和正能量的沟通与应对生活&#xff08;自卑vs自信&#xff0c;悲观vs乐观&#xff09; 文章目录 一、性格底色&#xff08;自我认知&#xff0c;世界观&#xff09;1、从悲观的底色开始2、用摆烂、自嘲的方式与世界和解 二、沟通方法…

同余式,乘法逆元,费马小定理

同余式 同余式是 数论 的基本概念之一&#xff0c;设m是给定的一个正整数&#xff0c;a、b是整数&#xff0c;若满足m| (a-b)&#xff0c;则称a与b对模m 同余 &#xff0c;记为a≡b (mod m)&#xff0c;或记为a≡b (m)。 这个式子称为模m的同余式&#xff0c;若m∤ (a-b)&…

express入门02静态资源托管

目录 1 搭建静态资源结构2 代码助手3 多目录托管4 服务器热启动总结 上一篇我们讲解了使用express搭建服务器的过程&#xff0c;服务器搭建好了之后&#xff0c;除了在地址栏里输入URL发起get请求或者post请求外&#xff0c;通常我们还需要访问静态资源&#xff0c;比如html、c…

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时&#xff0c;若发现程序运行时间越长&#xff0c;占用内存越大直至崩溃&#xff0c;通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因&#xff0c;包括数组和字符串处理、未释放的资源、循环中的对象创建等&#xff0c;并提供具体的解决方…

Linux-笔记 设备树插件

前言&#xff1a; 设备树插件&#xff08;Device Tree Blob Overlay&#xff0c;简称 DTBO&#xff09;是Linux内核和嵌入式系统中用于动态修改或扩展系统运行时的设备树配置的一种机制。它是对传统设备&#xff08;Device Tree Source&#xff0c;简称 DTS&#xff09;的补充&…

Nextjs 集成富文本编辑器react-quill

目录 一、组件代码 二、参考文档 由于Next与react有些差别&#xff0c;直接调用组件会报无法找到文档的错误&#xff0c;于是我们只有考虑动态导入了解决问题。因为富文本编辑器一般作用与form页面对SEO意义不大&#xff0c;所以这里可以考虑暂时关闭SSR。 一、组件代码 /*…

推荐系统学习笔记(五)-----双塔模型

目录 双塔模型 训练 pointwise训练 pairwise训练 listwise训练 双塔模型 矩阵补充模型只用到了用户id和物品id&#xff0c;其余属性没有用上 用户属性也可以这样处理 用户塔和物品塔各输出一个向量&#xff0c;两个向量的余弦相似度作为兴趣的预估值 训练 第一种&#x…

麦稻同框丰收忙,食家巷美味之旅

在夏收时节&#xff0c;金色的麦浪随风翻滚&#xff0c;洋溢着丰收的喜悦。而在这丰收的背后&#xff0c;食家巷以其独特的产品&#xff0c;为人们带来了一场与麦稻有关的美味盛宴。 传统的烤馍&#xff0c;带着麦子烘焙后的醇厚香气。用心挑选的原料&#xff0c;经过精…

如何用二维码进行来访登记?这个模板帮你轻松实现!

在工厂、学校、写字楼、建筑工地等人员出入频繁的场所&#xff0c;使用传统的纸质登记方法容易造成数据丢失&#xff0c;而且信息核对过程繁琐&#xff0c;效率低下。 可以用二维码代替纸质登记本&#xff0c;访客进入时扫码就能登记身份信息&#xff0c;能够提高门岗访客管理…

气膜建筑在体育和娱乐行业的多样化应用—轻空间

随着人们生活水平的提高和健康意识的增强&#xff0c;体育和娱乐行业的发展迎来了新的机遇和挑战。气膜建筑&#xff0c;作为一种新型建筑技术&#xff0c;因其独特的优势和广泛的应用场景&#xff0c;正在引领体育和娱乐行业的新潮流。 快速建设高品质体育场馆 气膜建筑以其快…

护眼台灯怎么选?保护孩子视力看这些标准!

如果家中孩子最近开始出现“眯眼”的行为&#xff0c;那么家长们就要格外注意了&#xff01;孩子很可能会出现近视的情况&#xff0c;要注意观察学习写作业的光线以及用眼姿势习惯&#xff0c;同时可以及时就医检测。如今&#xff0c;孩子的学习负担越来越大&#xff0c;孩子的…

qt-C++笔记之命令行生成项目pro文件(极简编译qt项目代码)

qt-C笔记之命令行生成项目pro文件(极简编译qt项目代码) 文章目录 qt-C笔记之命令行生成项目pro文件(极简编译qt项目代码)步骤 1&#xff1a;生成项目文件步骤 2&#xff1a;生成 Makefile 文件步骤 3&#xff1a;编译程序详细解释注意事项项目结构main.cpp 文件生成项目文件生成…

【Mac】Premiere Pro 2024 for Mac v24.1软件介绍和安装教程

软件介绍 Premiere Pro是一款专业的视频编辑软件。它被广泛应用于电影、电视和网络视频的制作和编辑&#xff0c;具备强大的功能和灵活的工作流程&#xff0c;适用于从初学者到专业人士的各种需求。以下是对Premiere Pro的一些详细介绍&#xff1a; 主要特点 多轨道时间线编…

据阿谱尔APO Research统计显示,2023年全球有机硅弹性体凝胶市场销售额约为2.1亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023年全球有机硅弹性体凝胶市场销售额约为2.1亿美元&#xff0c;预计在2024-2030年预测期内将以超过4.17%的CAGR&#xff08;年复合增长率&#xff09;增长。 有机硅弹性体凝胶是一类具有独特性质和广泛应用领域…

[论文笔记]Query Rewriting for Retrieval-Augmented Large Language Models

引言 今天带来论文Query Rewriting for Retrieval-Augmented Large Language Models的笔记。 本篇工作从查询重写的角度介绍了一种新的框架&#xff0c;即重写-检索-阅读&#xff0c;而不是以前的检索-阅读方式&#xff0c;用于检索增强的LLM。关注的是搜索查询本身的适应性&…

Java二维数组的定义以及使用

二维数组 1.二维数组的定义格式 1.概述:数组中的套多个数组 2.定义格式a.动态初始化数据类型[][] 数组名 new 数据类型[m][n]数据类型 数组名[][] new 数据类型[m][n]数据类型[] 数组名[] new 数据类型[m][n]m:代表的是二维数组的长度n:代表的是二维数组中每一个一维数组的…

20240607在ubuntu下解压缩7z的压缩包文件

20240607在ubuntu下解压缩7z的压缩包文件 2024/6/7 10:26 百度&#xff1a;ubuntu 7z解压缩 在Ubuntu中&#xff0c;可以使用7z命令来解压.7z文件。首先&#xff0c;确保你已经安装了p7zip-full包&#xff0c;如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo …