二叉树构建(从3种遍历中构建)python刷题记录

news2024/11/13 16:49:06

R3-树与二叉树篇.

目录

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

算法思路:

灵神套路 

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

算法思路: 

灵神套路 

从前序和后序遍历序列构造二叉树

算法思路:  

灵神套路 

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

算法思路:

# 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]:
        #仅限于无结点重复的序列
        def recur(root,left,right):
            #递归终止条件(遍历一遍中序遍历完成)
            if left>right:return
            #建立根节点的子树
            node=TreeNode(preorder[root])
            i=dict[preorder[root]]
            #左子树递归
            node.left=recur(root+1,left,i-1)
            #右子树递归
            node.right=recur(i-left+root+1,i+1,right)
            return node

        #存储中序遍历的值与索引的映射
        dict={key:index for index,key in enumerate(inorder)}
        return recur(0,0,len(inorder)-1)

        

灵神套路 

# 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]:
        def dfs(pre_l,pre_r,in_l,in_r):
            if pre_l==pre_r:
                return None
            #左子树大小
            left_size=dict[preorder[pre_l]]-in_l
            left=dfs(pre_l+1,pre_l+1+left_size,in_l,in_l+left_size)
            right=dfs(pre_l+1+left_size,pre_r,in_l+1+left_size,in_r)
            return TreeNode(preorder[pre_l],left,right)
        #存储中序遍历的值与索引的映射
        dict={key:index for index,key in enumerate(inorder)}
        #左闭右开区间
        return dfs(0,len(preorder),0,len(inorder))

        

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

算法思路: 

灵神套路 
# 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, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        def dfs(in_l,in_r,post_l,post_r):
            if post_l==post_r:
                return None
            #左子树大小
            left_size=dict[postorder[post_r-1]]-in_l
            left=dfs(in_l,in_l+left_size,post_l,post_l+left_size)
            right=dfs(in_l+left_size+1,in_r,post_l+left_size,post_r-1)
            return TreeNode(postorder[post_r-1],left,right)
        #存储中序遍历的值与索引的映射
        dict={key:index for index,key in enumerate(inorder)}
        #左闭右开区间
        return dfs(0,len(inorder),0,len(postorder))

从前序和后序遍历序列构造二叉树

算法思路:  

灵神套路 
# 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 constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        def dfs(pre_l,pre_r,post_l):
            if pre_l==pre_r:
                return None
            #叶子结点
            if pre_l+1==pre_r:
                return TreeNode(preorder[pre_l])
            #左子树大小
            left_size=dict[preorder[pre_l+1]]-post_l+1
            left=dfs(pre_l+1,pre_l+1+left_size,post_l)
            right=dfs(pre_l+1+left_size,pre_r,post_l+left_size)
            return TreeNode(preorder[pre_l],left,right)
        #存储前序遍历的值与索引的映射
        dict={key:index for index,key in enumerate(postorder)}
        #左闭右开区间
        return dfs(0,len(preorder),0)

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

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

相关文章

请你学习:前端布局2 - 定位(Positioning)是一种重要的布局技术

在页面布局中,定位(Positioning)是一种重要的布局技术,它允许我们精确地控制元素在页面上的位置。定位模式、是否脱标以及移动位置是理解定位的三个关键方面。 1 定位模式 定位模式决定了元素在文档中的定位方式,通过…

一款完全免费的数据恢复软件

WinFR,Windows文件恢复(微软命令行程序)的免费图形界面,帮您轻松恢复文件。WinFR是免费的Windows数据恢复替代方案,支持U盘数据恢复、硬盘数据恢复、存储卡数据恢复、文件数据恢复等功能。WinFR完全调用Windows文件恢复…

简单的docker学习 第2章docker引擎

第2章docker引擎 2.1Docker 引擎发展历程 2.1.1 首发版本架构 Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker Daemon。不过,该架构依赖于 LXC,使得 Docker 存在严重的问…

第一百八十六节 Java XML教程 - Java DOM编辑

Java XML教程 - Java DOM编辑 属性 以下代码显示如何向元素添加属性。 import java.io.StringWriter;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Tr…

【OS】AUTOSAR OS Spinlock实现原理(下篇)

目录 3.1 Spinlock配置代码 3.1.1 Os_SpinlockConfigType_Tag 3.1.2 Os_LockConfigType_Tag 3.1.3 不同配置参数对配置代码生成的影响 3.2 Os_GetSpinlock详解 3.2.1 Os_SpinlockIsNotLockedLocal 3.2.2 Os_SpinlockIsLockOrderValid 3.2.3 Os_SpinlockSuspendByMethod…

bias偏置项(bias term)

bias偏置项(bias term)或者称为截距项(intercept term) 简称b 它其实就是函数的截距,与线性方程y wx b中的b的意义是一样的。 在y wx b中,b表示函数在y轴上的截距,控制着函数偏离原点的距…

食品安全知识竞赛规则及流程方案

活动简介 本届竞赛以“反食品浪费”为主线,在专业知识比拼基础上,融入了食物贮存方法、标签标识认知等生活化场景,将科普知识与日常生活紧密结合,更深入地践行“以赛促学 以学促行”的比赛口号,旨在通过大学生群体带动…

vue3集成LuckySheet实现导入本地Excel进行在线编辑,以及导出功能

第一步:克隆或者下载下面的代码 git clone https://github.com/dream-num/Luckysheet.git第二步:安装依赖 npm install npm install gulp -g 第三步:运行 npm run dev效果如下图所示 第四步:打包 打包执行成功后,…

萤石摄像头更换wifi操作记录

手机和摄像头在同一wifi下下载萤石云视频app长按reset,蓝灯常闪app中配置WiFi,要输入设备验证码,在设备上有配置完就可以了 H264编码修改方法https://open.ys7.com/bbs/article/14

️ LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备(下篇)

引言:种下一棵树最好的时间是十年前,其次是现在 书接上回:将对话式人工智能引入您的本地设备成为可能CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140865426 目的:在这个大模型横行的时候,我们常用电脑如何开展大模型的工作…

抽帧剪辑手法有哪些有什么好处 抖音抽帧补帧能不能提高作品原创度 抽帧剪辑可以防止被判搬运么 会声会影视频制作教程 会声会影中文免费下载

如果作品过不了原创检测,那么建议你一定要学会抽帧剪辑,这是目前最有效的防搬运检测手段。精细化地抽帧、补帧,可以轻松通过视频平台的原创和版权检测,避免视频被判搬运。在抖音或快手上进行短视频创作时,‌抽帧和补帧…

JS+CSS案例:JS+CSS 实现漂亮时尚的样式表切换(换肤)功能

切换样式表可能有人不理解,但说到网站换肤,大概率就很多人都明白了。因为它是很多网站都已经有的功能了,最常见的就是很多网站的关灯模式。本文,就给大家分享一个我自己网站上使用的样式表切换的方案。 案例效果 目录结构 文件准…

Ubuntu22.04 解决fabric 安装gradle构建的Java合约超时

问题 fabric安装gradle构建的Java合约时遇到合约代码编译超时问题,如下: $ peer lifecycle chaincode install cp.tar.gz Error: chaincode install failed with status: 500 - failed to invoke backing implementation of InstallChaincode: could …

宝塔面板上,安装rabbitmq

废话不多说,直接上干货! 第一步:登录宝塔账号,在软件商店里搜索 第二步:点击设置 第三步:已经完成了,还看啥!

3D魔方lua核心脚本制作

制作不易,请好好欣赏 U→R→F→D→L→B 废话不多说,上脚本 --魔方基本运行程序 --星空露珠优化脚本lua --主核心来自分享 --666 --[=[ #G4=I 1 # 2-----------2------------1 # | U1(0) U2(1) U3(2) | # …

Java:Thread类

Thread的常见构造方法 Thread的常见属性 ID 是线程的唯一标识,不同线程不会重复名称是在使用各种调试工具时会用到的状态表示线程当前所处的情况优先级高的线程理论上来说更容易被调度到关于后台线程,需要记住:JVM会在一个进程的所有非后台线程结束后,才会结束运行是否存活,即r…

基于python做镜像文件

用python制作网页镜像文件 第一步&#xff1a;初始化操作&#xff0c;用可用镜像源&#xff1a; mkdir -p /etc/docker tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["https://hub.docker-alhk.dkdun.com/"] } EOF systemctl daemon…

攻击者劫持 Facebook 页面用于推广恶意 AI 照片编辑器

近日&#xff0c;有攻击者劫持了 Facebook 上的网页&#xff0c;诱骗用户下载一个合法的人工智能&#xff08;AI&#xff09;照片编辑器&#xff0c;但实际上他们真正下载的却是一个专门用以盗取用户的凭据信息窃取程序。 趋势科技的研究人员发现的这一恶意广告活动利用了人工…

ModuleNotFoundError: No module named ‘tqdm‘

报错信息&#xff1a; tqdm是一个快速、可扩展的Python进度条库&#xff0c;用于展示迭代器的长循环执行进度。 解决&#xff1a;通过以下命令安装 使用conda命令安装 conda install tqdm使用pip安装&#xff1a; pip install tqdm

临床数据科学中有关试验设计的四个关键要素

临床数据科学是现代医学研究中不可或缺的组成部分&#xff0c;通过科学的方法和统计分析工具来揭示医疗数据背后的规律和真相。试验设计是临床数据科学的核心环节&#xff0c;直接关系到研究结果的可靠性和科学性。 在过去几十年中&#xff0c;随机临床试验&#xff08;Randomi…