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

news2024/10/5 19:10:59

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

    • 先序无法确定子树大小,中序找不到根;所以用先序找根,用中序找大小
    • 题解1 递归
    • 题解2 迭代

给定两个整数数组 preorderinorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

先序无法确定子树大小,中序找不到根;所以用先序找根,用中序找大小

题解1 递归

/**
 * 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 {
    unordered_map<int, int> idx;
public:
// 先序自上而下,中序确定左右子树大小
    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right){
        if(pre_left > pre_right) return nullptr;
        
        // 用前序找根(把树单元化,叶子结点看作无左右子的根), 中序找左树大小
        int root_idx = pre_left;
        // 哈希表查此根结点在中序遍历数组的位置
        int root_in = idx[preorder[root_idx]];
        
        TreeNode* root = new TreeNode(preorder[root_idx]);
        // 左树大小
        int num_left = root_in - in_left;
		// left树,越往下走右边界越收紧
		// 但在preoreder里涉及到赋值,需要往后找,左边界+1
        root->left = build(preorder, inorder, pre_left+1, pre_left+num_left, in_left, root_in-1);
        // right树,越往下走左边界约收紧
        // 同样在preorder里涉及到遍历问题(先序遍历:遍历完左再遍历右,所以到右侧应该是+num_left+1)
        // 再inorder里就是在根节点的右侧,root_in+1即可
        root->right = build(preorder, inorder, pre_left+num_left+1, pre_right, root_in+1, in_right);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int s = preorder.size();
        for(int i = 0; i < s; i++){
            idx[inorder[i]] = i;
        }
        // 含右边界的版本
        return build(preorder, inorder, 0, s-1, 0, s-1);
    }
};

在这里插入图片描述

题解2 迭代

class Solution {
    unordered_map<int, int> idx;
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int s = preorder.size();
        TreeNode* root = new TreeNode(preorder[0]);
        stack<TreeNode*> rstk;
        rstk.push(root);
        int idx = 0;
        for(int i = 1; i < s; i++){
            int val = preorder[i];
            TreeNode* node = rstk.top();
            // 判断当前node是不是叶子结点(拐点)
            if(node->val != inorder[idx]){
                node->left = new TreeNode(val);
                rstk.push(node->left);
            }else{
                // 用中序查当前先序的结点i是不是右树
                while(rstk.size() && rstk.top()->val == inorder[idx]){
                    node = rstk.top();
                    rstk.pop();
                    idx ++;
                }
                node->right = new TreeNode(val);
                rstk.push(node->right);
            }
        }
        return root;
    }
};

在这里插入图片描述

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

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

相关文章

世界各国家地区3d地形图

1、GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图高级培训班 2、全流程R语言Meta分析核心技术 3、最新CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用 4、WOFOST模型与PCSE模型实践技术应用 5、Biome-BGC生态系统模型与Python融合技术实践应用 6、基于…

Sqlserver查看表的主键,删除主键,修改主键

1.查看表的结构 EXEC sp_help 表名; 查询使用 sp_help 存储过程&#xff0c;它将返回有关表的详细信息&#xff0c;包括列名、数据类型、约束等。你可以在结果中查找带有 “PK” 标记的列&#xff0c;它们表示主键约束。 2.查看表的主键信息 EXEC sp_pkeys 表名; 查询使用 sp_…

直线导轨精度等级在设备中有什么影响?

直线导轨的精度选择是直线导轨应用中的重要环节&#xff0c;需要根据具体的应用场景和设备要求来选择合适的精度等级&#xff08;常见分3个等级&#xff1a;N/H/P&#xff09;。下面我们来详细了解一下直线导轨的精度选择。 1、精度等级的概念&#xff1a;直线导轨的精度等级是…

linux查看系统信息命令

1.查看linux内核版本 [rootmaster ~]# uname -r 3.10.0-123.el7.x86_64 [rootmaster ~]# uname -a Linux master 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux2.查看文件系统的磁盘大小和剩余空间大小 [rootmaster ~]# df -h …

手机没电用日语怎么说?你会吗?柯桥常用日语学习

手机没电在日语里可以表达为: 1. スマホの電池が切れた。 直接使用“電池が切れる”来表示电池没有电了。 2. スマホのバッテリーが空に15857575376なった。 “バッテリーが空になる”也是表示电量耗尽的常用表达。 3. 充電が必要だ。 “充電が必要”意思是需要充电。 4…

使用 Splashtop 驾驭未来媒体和娱乐

在当今时代&#xff0c;数字转型不再是可选项&#xff0c;而是必选项。如今&#xff0c;媒体与娱乐业处于关键时刻&#xff0c;正在错综复杂的创意、技术和远程协作迷宫之中摸索前进。过去几年发生的全球事件影响了我们的日常生活&#xff0c;不可逆转地改变了行业的运作方式&a…

Fuzz测试 发现软件中的隐患和漏洞的秘密武器

0x01 什么是模糊测试 模糊测试&#xff08;Fuzz Testing&#xff09;是一种广泛用于软件安全和质量测试的自动化测试方法。它的基本思想是向输入参数或数据中注入随机、不规则或异常的数据&#xff0c;以检测目标程序或系统在处理不合法、不正常或边缘情况下的行为。模糊测试通…

ctDNA助力难治性RAS野生型mCRC抗EGFR单抗再挑战优势人群筛选

ctDNA检测方便快捷、安全性好、可反复取样&#xff0c;在CRC精准治疗领域具有广阔的应用前景。动态ctDNA检测有望指导患者抗EGFR单抗治疗的“再挑战”&#xff0c;为患者带来更多希望。但最佳抗EGFR单抗再挑战策略、对比标准三线治疗的疗效差异及ctDNA检测在其中扮演的角色尚无…

popcount相关性质+从低往高的数位dp:CF1734F

https://www.luogu.com.cn/problem/CF1734F popcount有个性质&#xff1a;popcount(x)^popcount(y)popcount(x^y) 考虑数位dp&#xff0c;发现很难 然后我们发现可以从低往高dp&#xff08;当做套路&#xff09; 只不过是否达到上界变成是否超出去 #include<bits/stdc.h…

0Java基础

1.Java基础篇 1.1基本 a.JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;Java 开发工具包&#xff0c;提供了 Java 的开发环境和运行环境。 JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;Java 运行环境&#xff…

day01_基础

零、今日内容 1 jdk 2 idea使用 3 HelloWorld程序 4 变量 5 数据类型 6 String 一、JDK安装 JDK java开发工具包,敲代码的环境 1.1 卸载 控制面板 -> 卸载程序 -> 选择jdk,右键卸载 1.2 安装 注意: 现在安装的是JDK8版本,虽然最新的版本是21版本,但是工作市场中最流行的…

vue3+ts项目04-国际化

yarn add vue-i18n yarn add js-cookie yarn add types/js-cookiesrc下新建i18n文件夹&#xff0c;该文件夹下新建lang和pages文件夹&#xff0c; lang文件夹下新建en.ts // 定义内容 export default {router: {home: home,system: {system: system,menu: systemMenu,role: sy…

ubuntod安装datasophon问题记录

问题描述&#xff1a; 主机agent分发报红 解决步骤一&#xff1a; 修改datasophon-worker.tar.gz文件 解压/opt/datasophon/DDP/packages目录下的datasophon-worker.tar.gz文件修改datasophon-worker/bin目录下的datasophon-worker.sh文件 . /etc/profile解决步骤二&#xf…

非凸科技受邀出席源创会,探讨数据技术的未来发展

9月23日&#xff0c;由开源中国联合腾讯云TVP开展的“数据与前沿技术”源创会活动在成都顺利举行&#xff0c;非凸科技受邀出席&#xff0c;与业界专家们共同探讨了数据存储、数据分析、数据挖掘等前沿技术。 会上&#xff0c;非凸科技成都分公司研发总监赵海峰以“量化交易的数…

LLaVa大模型关键技术及在线演示

LLaVA&#xff0c;一种新的大型多模态模型&#xff0c;称为“大型语言和视觉助手”&#xff0c;旨在开发一种通用视觉助手&#xff0c;可以遵循语言和图像指令来完成各种现实世界的任务。 这个想法是将 GPT-4 等大型语言模型 (LLM) 的强大功能与 CLIP 等视觉编码器相结合&#…

Transformer模型 | 基于Spatial-Temporal Transformer的城市交通流预测

交通预测已成为智能交通系统的核心组成部分。然而,由于交通流的高度非线性特征和动态的时空依赖性,及时准确的交通预测,尤其是长时交通流预测仍然是一个开放性的挑战。在这篇文章中,作者提出了一种新的时空Transformer网络(STTNs)模型,该模型联合利用了动态有向的空间依…

Meta开源数字水印Stable Signature,极大增强生成式AI安全

全球社交、科技巨头Meta&#xff08;Facebook、Instagram等母公司&#xff09;在官网宣布&#xff0c;开源数字水印产品Stable Signature&#xff0c;并公开论文。 据悉&#xff0c;Stable Signature是由Meta和INRIA&#xff08;法国国家信息与自动化研究所&#xff09;联合开…

决策树算法——C4.5算法

目录 1.ID3算法 2.C4.5算法 3.信息增益率 &#xff08;1&#xff09;信息增益率 &#xff08;2&#xff09;案例 4.决策树的剪枝 5.总结 &#xff08;1&#xff09;优点与改进 &#xff08;2&#xff09;缺点 &#xff08;3&#xff09; 总结及展望 近年来决策树方…

算法——动态规划

一、 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 最大子数组和&#xff0c;可以建立一个dp表&#xff0c;来存放当前的位置的累加的最大和 int maxSubArray(vector<int>& nums) {int nnums.size();if(n1)return nums[0];vector<int> dp(n);int…

3.(vue3.x+vite)class动态绑定的方式

前端技术社区总目录(订阅之前请先查看该博客) 效果浏览 代码如下 <template><div><div :class="{acti