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

题目:

思想:

首先先序遍历能确定根节点的值,此时查看该值在中序遍历中的位置(如果索引为i),那么i左侧为左子树,i 右侧为右子树。从中序数组中即可看出左子树结点个数为 i,右子树节点个数为inorder.size()-i-1。也就代表先序数组中除了第一个元素外,先 i 个元素是左子树对应的先序数组元素,后面的元素为右子树对应的先序数组元素。递归的形式就出现啦!如果没想到可以看一下函数的参数。

代码如下:

C++:

/**
 * 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* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size()==0){return nullptr;}
        TreeNode* head=new TreeNode;
        head->val=preorder[0];
        int idx=find(inorder.begin(),inorder.end(),preorder[0])-inorder.begin();
        //preorder---左子树
        vector<int>::const_iterator Firstprel=preorder.begin()+1;
        vector<int>::const_iterator Secondprel=preorder.begin()+idx+1;
        vector<int> prel;
        prel.assign(Firstprel,Secondprel);
        //preorder---右子树
        vector<int>::const_iterator Firstprer=preorder.begin()+idx+1;
        vector<int>::const_iterator Secondprer=preorder.end();
        vector<int> prer;
        prer.assign(Firstprer,Secondprer);
        //inorder---左子树
        vector<int>::const_iterator Firstinl=inorder.begin();
        vector<int>::const_iterator Secondinl=inorder.begin()+idx;
        vector<int> inl;
        inl.assign(Firstinl,Secondinl);
        //inorder---右子树
        vector<int>::const_iterator Firstinr=inorder.begin()+idx+1;
        vector<int>::const_iterator Secondinr=inorder.end();
        vector<int> inr;
        inr.assign(Firstinr,Secondinr);

        head->left=buildTree(prel,inl);
        head->right=buildTree(prer,inr);
        return head;

    }
};

注意看一下这里的写法:

int idx=find(inorder.begin(),inorder.end(),preorder[0])-inorder.begin();

参考博文:(在inorder中寻找preorder[0]这个元素,返回其索引值)

c++vector查找元素所在的索引下标_vector查找元素索引-CSDN博客 

//preorder---左子树
vector<int>::const_iterator Firstprel=preorder.begin()+1;
vector<int>::const_iterator Secondprel=preorder.begin()+idx+1;
vector<int> prel;
prel.assign(Firstprel,Secondprel);

参考博文:(就是把preorder中的第一个元素直到第idx个元素,复制给prel)

vector 切片,截取指定区间元素_vector截取-CSDN博客

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        if len(preorder)==0:
            return None
        head=TreeNode(preorder[0])
        idx=inorder.index(preorder[0])
        prel=preorder[1:idx+1]
        prer=preorder[idx+1:]
        inl=inorder[:idx+1]
        inr=inorder[idx+1:]
        head.left=self.buildTree(prel,inl)
        head.right=self.buildTree(prer,inr)
        return head
        

注意这样几个写法:

Python中的空指针为None

Python中的创建实例

head=TreeNode(preorder[0])

Python中的从inorder中寻找preorder[0],并返回索引

idx=inorder.index(preorder[0])

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

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

相关文章

Galxe:被低估的加密市场掘金地+Web3门户

在BTC ETF获得 SEC 的批准之后&#xff0c;机构资金大量买入推动BTC上涨&#xff0c;并带动整个加密市场回暖进入牛市。那么&#xff0c;对于习惯了熊市保守心态的投资者来说&#xff0c;接下来如何转换策略适应牛市&#xff1f;对即将进场的Web2用户来说&#xff0c;如何玩赚W…

Git小册-笔记迁移

Git简介 Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;。 所有的版本控制系统&#xff0c;其实只能跟踪文本文件的改动&#xff0c;比如TXT文件&#xff0c;网页&#xff0c;所有的程序代码等等&#xff0c;Git也不例外。版本控制系统可以告诉…

【elementplus】el-image图片预览的显示不全问题(和el-table、el-dialog组合使用时)

问题&#xff1a; 在和el-table、el-dialog组合使用时&#xff0c;el-image图片预览的时候&#xff0c;会可能出现显示不全图片的情况。 解决方法&#xff1a; <el-image-viewer:z-index"3000":teleported"true"/>element文档中有属性&#xff1a;…

vue2的element UI 表格单选

代码 this.$refs.multipleTable.toggleRowSelection(selection.shift(), false);multipleTable 是定义的表格的ref

【贪玩巴斯】关于在colab中上传本地csv使用方法(不用云)

有三种方法&#xff0c;但是这一种是最方便的。 当CSV文档在本地电脑&#xff0c;只需要输入以下代码&#xff08;个人建议在首行&#xff09;&#xff1a; from google colab import files uploadedfilesupload() 然后点击Choose Files 选择CSV文档&#xff08;注意文件是…

Spring框架Bean对象的五个作用域

一、前言&#xff1a;Bean对象简介 在Spring项目中&#xff0c;那些由Spring IoC容器所管理的对象&#xff0c;称为bean。简单地讲&#xff0c;bean就是由Spring容器初始化、装配及管理的对象&#xff0c;除此之外&#xff0c;bean就与应用程序中的其他对象没有什么区别了。 而…

phpstorm console xdebug

1.所有配置跟浏览器http请求一样 2.记得Current File 必须是controller文件 注意&#xff1a;如果没有出发断点&#xff0c;则echo phpinfo(),查看remote_port 和phpstorm 配置是否对上。

libevent源码解析:io事件(一)

文章目录 前言一、用例简单服务端实现参数设置 二、基本数据结构介绍三、源码分析event_base_newevent_newevent_addevent_base_dispatch 三、libevent和epoll中的事件标记epoll中的事件标记libevent中的事件标记libevent和epoll中事件标记的对应关系 总结 前言 libevent中对三…

sqlserver 默认端口号不通 1433 开启监听

1.打开SQL Server 2022 配置管理器 查看这3个东西是否启用&#xff0c;然后双击TCP/IP 把默认端口全部设置成1433 然后cmd netstat -an | find "1433" 查看端口是否打开监听

【AI视野·今日Sound 声学论文速览 第五十四期】Thu, 7 Mar 2024

AI视野今日CS.Sound 声学论文速览 Thu, 7 Mar 2024 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Can Audio Reveal Music Performance Difficulty? Insights from the Piano Syllabus Dataset Authors Pedro Ramoneda, Minhee Lee, Dasa…

感染了后缀为.[[backup@waifu.club]].wis勒索病毒如何应对?数据能够恢复吗?

引言&#xff1a; 在当今数字化时代&#xff0c;网络安全威胁层出不穷。其中&#xff0c;勒索软件是一种常见而具有破坏性的威胁之一。而.[[backupwaifu.club]].wis、[[MyFilewaifu.club]].wis、.[[Rastairmail.cc]].wis勒索病毒作为其中的一种&#xff0c;以其高度破坏性和隐…

软考69-上午题-【面向对象技术2-UML】-关系

一、关系 UML中有4种关系&#xff1a; 依赖&#xff1b;关联&#xff1b;泛化&#xff1b;实现。 1-1、依赖 行为&#xff08;参数&#xff09;&#xff0c;参数就是被依赖的事物&#xff0c;即&#xff1a;独立事物。 当独立事物发生变化时&#xff0c;依赖事务行为的语义也…

阿里云ECS磁盘扩容操作手册

云原生专栏大纲 文章目录 ESC磁盘扩容步骤前提条件云盘备份云盘扩容扩容分区和文件系统前提条件操作视频操作步骤准备工作&#xff1a;获取目标云盘信息步骤1&#xff1a;扩容分区步骤2&#xff1a;扩容文件系统 ESC磁盘扩容步骤 扩容已有云盘的操作步骤和注意事项_云服务器 …

一些硬件知识(六)

防反接设计&#xff1a; 同步电路和异步电路的区别: 同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源&#xff0c;因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。 异步电路:电路没有统一的时钟&#xff0c;有些触发器的时钟输入端与时钟脉冲源相连…

微信小程序(五十三)修改用户头像与昵称

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.外界面个人资料基本模块 2.资料修改界面同步问题实现&#xff08;细节挺多&#xff0c;考虑了后期转服务器端的方便之处&#xff09; 源码&#xff1a; app.json {"window": {},"usingCompone…

打造经典游戏:HTML5与CSS3实现俄罗斯方块

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Android随手记

activity的生命周期 创建时 onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy() 切换时 a切换到b a.onCreate() - a.onStart() - a.onResume - a.onPause - b.onCreate() - b.onStart() - b.onResume() - a.onStop() b切换回a b.onPause() - a.onR…

设计模式之——简单工厂模式

上图为简单工厂模式的架构图。 1&#xff0c;产品&#xff08;Product&#xff09; 将会对接口进行声明。 2&#xff0c;具体产品&#xff08;Concrete Products&#xff09;是产品接口的不同实现。 3&#xff0c;创建者&#xff08;Concrete Creators&#xff09;将会重写基…

Docker基础教程 - 7 容器数据卷

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 7 容器数据卷 什么是容器卷&#xff0c;为什么需要容器卷&#xff1f; 我们在运行容器的时候&#xff0c;产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器&#xff0c;数据…

macOS Sonoma 14.4(23E214)发布[附黑苹果/Mac系统镜像]

黑果魏叔3 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.4 更新&#xff08;内部版本号&#xff1a;23E214&#xff09;&#xff0c;本次更新距离上次发布隔了 29 天。 魏叔翻译 macOS 14.4 版本主要内容如下&#xff1a; macOS Sonoma 14.4 为你的 Mac 引…