数据结构与算法-构建二叉树

构建二叉树

已知前序遍历与中序遍历或已知后序遍历和中序遍历可以构建唯一的二叉树

根据前序遍历与中序遍历建树

class Tree_Node():def __init__(self,val):self.val = valself.left = Noneself.right = None
# 构建二叉树
# 根据前序遍历与中序遍历构建二叉树
# 前序遍历[3,9,2,1,7]
# 中序遍历[9,3,1,2,7]
# 后序遍历[9,1,7,2,3]
# 根据前序遍历,确定树的构建顺序
# 根据中序遍历,确定子节点的数量关系
# 前序遍历中,第一层树节点为{根:3},{左子树:9},{右子树:2,1,7}
# 第二层节点为:{叶节点:2}{左:1}{右:7}
# 利用中序遍历来表示:前序遍历中单签节点及叶子结点的索引范围
# 前序遍历中:根节点:i=0,在中序遍历中索引范围为{l:0,r:len(nums)}
# 前序遍历中:左子树:i+1,在中序遍历中的索引范围为:{l,m-1:中序遍历中根节点左侧数值}
# 前序遍历中:右子树:i+1+(m-l:剩余左子树的数量),在中序遍历中的索引范围为:{m+1中序遍历中根节点右侧数值,r}
# 利用递归,逐步更新左右子树的索引范围,即可实现利用前序便利与中序遍历数组构建唯一二叉树def dfs1(preorder,inorder,i,l,r):# print("当前高度的根节点所在右子树中的索引{}".format(i))# print("当前左右边界l:{} and r:{}".format(l,r))if r-l < 0 or i >r:return None# 初始化根节点root = Tree_Node(preorder[i])#中序遍历中根节点的索引m = inorder[preorder[i]]#左子树root.left = dfs1(preorder,inorder,i+1,l,m-1)# 右子树root.right = dfs1(preorder,inorder,i+1+(m-l),m+1,r)return root
def build_tree_basepre(preorder,inorder):inorder = {value:key for key,value in enumerate(inorder)}l = 0r = len(preorder)-1i = 0root = dfs1(preorder,inorder,i,l,r)return rootpreorder = [3,9,2,1,7]
inorder = [9,3,1,2,7]
pre_tree = build_tree_basepre(preorder,inorder)
print(pre_tree.right.right.val)

根据后序遍历与中序遍历建树

# 中序遍历[9,3,1,2,7]
# 后序遍历[9,1,7,2,3]
# 根据前序遍历,确定树的构建顺序
# 根据中序遍历,确定子节点的数量关系
# 前序遍历中,第一层树节点为{根:3},{左子树:9},{右子树:1,7,2}
# 第二层节点为:{叶节点:2}{左:1}{右:7}
# 利用中序遍历来表示:前序遍历中单签节点及叶子结点的索引范围
# 后序遍历中:根节点:i=r,在中序遍历中索引范围为{l:0,r:len(nums)}
# 后遍历中:右子树:i=i-1,在中序遍历中的索引范围为:{l,m-1:中序遍历中根节点左侧数值}
# 后遍历中:左子树:i = i-1-(m-1-l):剩余左子树的数量),在中序遍历中的索引范围为:{m+1中序遍历中根节点右子树,r}
# 利用递归,逐步更新左右子树的索引范围,即可实现利用前序便利与中序遍历数组构建唯一二叉树
def dfs2(postorder,inorder,i,l,r):# 初始化根节点if r-l <0 or i < 0 :return Noneprint("当前高度的根节点所在右子树中的索引{}".format(i))print("当前左右边界l:{} and r:{}".format(l,r))root = Tree_Node(postorder[i])#中序遍历中根节点的索引m = inorder[postorder[i]]#左子树# print("创建左子树")root.left = dfs2(postorder,inorder,i-1-(m-l-1),l = l,r = m-1)# 右子树,i为初始化右子的根节点# print("创建右子树")root.right = dfs2(postorder,inorder,i-1,m+1,r)return root 
def build_tree_baseafter(afterorder,inorder):inorder = {value:key for key,value in enumerate(inorder)}l = 0r = len(afterorder)-1i = rroot = dfs2(afterorder,inorder,i,l,r)return root
postorder = [9,1,7,2,3]
inorder = [9,3,1,2,7]post_tree = build_tree_baseafter(postorder,inorder)
print(post_tree.right.right.val)

总结

  • 前序遍历中节点之间的关系为根节点->左子树->右子树,根据这个顺序将根节点为i,左子树为:i+1,右子树为i+1+(左子树的数量);根据中序遍历,确定i的取值范围(中序遍历的特点是左子树->根节点->右子树,可以区分左子树与右子树存包含的子节点数量关系),首先确定中序遍历中的根节点所在索引m进而可以划分左子树与右子树之间的索引区间左子树:[l:m-1];右子树:[m+1,r];利用递归实现二叉树的构建。
    值得注意的一点是,二叉树构建子树的递归条件(边界条件为,r-l>0,即数组区间不能小于0,其中当i>r)
  • 利用后序遍历与中序遍历构建二叉树则是利用后序遍历数组:左子树->右子树->根节点;则利用根节点为i=r,右子树i = i-1,左子树:i-1-(剩余左子树节点个数:m-1-l)

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

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

相关文章

77、贪心-买卖股票的最佳时机

思路 具体会导致全局最优&#xff0c;这里就可以使用贪心算法。方式如下&#xff1a; 遍历每一位元素找出当前元素最佳卖出是收益是多少。然后依次获取最大值&#xff0c;就是全局最大值。 这里可以做一个辅助数组&#xff1a;右侧最大数组&#xff0c;求右侧最大数组就要从…

ADS1.2中的代码debug的时候不出来代码的解决办法

我总觉得ADS1.2这个软件挺奇怪的&#xff0c;一阵一阵的&#xff0c;我遇到了很多奇怪的问题&#xff0c;这里记录一下吧。 1、新建文件的时候&#xff0c;没法选择这个add to project 解决办法&#xff1a;如果没有已存在的.mcp文件&#xff0c;就先新建project&#xff0c;然…

项目运行到手机端

运行到真机 手机和点到连在同一个wifi网络下面点击hbuiler上面的预览得到一个&#xff0c;network的网址这个时候去在手机访问&#xff0c;那么就可以访问网页了 跨域处理 这个时候可能会访问存在跨域问题 将uniapp的H5版本运行到真机进行调试&#xff0c;主要涉及到跨域问题…

java-Spring-mvc-(请求和响应)

目录 &#x1f4cc;HTTP协议 超文本传输协议 请求 Request 响应 Response &#x1f3a8;请求方法 GET请求 POST请求 &#x1f4cc;HTTP协议 超文本传输协议 HTTP协议是浏览器与服务器通讯的应用层协议&#xff0c;规定了浏览器与服务器之间的交互规则以及交互数据的格式…

【机器学习】HQ-Edit引领图像编辑新潮流

科技新纪元&#xff1a;HQ-Edit引领图像编辑新潮流 一、HQ-Edit的诞生&#xff1a;一场技术的革命二、技术实现与优势&#xff1a;强大的编辑能力和精准的匹配三、应用前景与实例展示&#xff1a;InstructPix2Pix的突破 在数字化时代&#xff0c;图像编辑技术正以前所未有的速度…

M3D-NCA: Robust 3D Segmentation with Built-In Quality Control论文速读

文章目录 M3D-NCA: Robust 3D Segmentation with Built-In Quality Control摘要方法实验结果 M3D-NCA: Robust 3D Segmentation with Built-In Quality Control 摘要 这是关于医学图像分割的一篇论文的结构化总结&#xff1a; 背景和挑战&#xff1a; 医学图像分割依赖于大型…

Kubernetes自动伸缩的主要类型有哪些?

Kubernetes中的自动伸缩功能主要有三种类型&#xff0c;分别针对不同的资源管理和应用场景。具体如下&#xff1a; Pod水平自动伸缩&#xff08;HPA&#xff09;&#xff1a;这是最常用的自动伸缩类型&#xff0c;它通过监控Pod的CPU利用率、内存利用率或自定义指标来增加或减…

【热闻速递】Google 裁撤 Python研发团队

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【&#x1f525;热闻速递】Google 裁撤 Python研发团队引入研究结论 【&#x1f5…

Spring中AOP原理

Spring中AOP原理 在Spring框架中&#xff0c;AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种重要的编程范式&#xff0c;它可以帮助我们实现对代码的横切关注点进行统一管理和处理。在Spring中&#xff0c;AOP的实现主要依赖 于两个核…

2405C++,部分解析数格

原文 如果一个很大的数格串,然后用户只想解析其中的一个字段,一般需要遍历所有串全部解析所有字段,这样效率就很低了. 如果可部分解析数格字段,就可避免全部解析了,从而获得更好的性能. iguana已增加了支持部分解析数格的特征,比如这样一个数格对象: struct some_test_t {i…

xyctf ez_rand

[核心的代码就是这一部分&#xff0c;只要得到v4的值&#xff0c;也就是随机种子&#xff0c;那就可以把值弄出来了。所以我们需要做的就是爆破随机种子。 然后有一点是需要注意的&#xff0c;IDA这里显示的数据有可能是小端序的&#xff0c;所以我们需要export data&#xff…

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入&#xff0c;30路DA输出的信号处理平台&#xff0c;处理平台采用双DSPFPGA的结构&#xff0c;DSP采用TI公司新一代DSP TMS320C6678&#xff0c;FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

向量的旋转矩阵

我们都知道&#xff0c;矩阵的乘法可以表示旋转。那么&#xff0c;这一理论的数学机理是什么呢&#xff1f;以及&#xff0c;这个旋转角度该怎么用矩阵表示呢&#xff1f; 本文用二维向量旋转来推导旋转矩阵的公式。假设&#xff0c;我们有一个向量P(x, y)&#xff0c;准备通过…

http和https 所有的请求头信息

http 所有的请求头信息 HTTP请求头信息包含了客户端向服务器发送请求时附带的各种细节信息,帮助服务器更好地处理请求。这些头部字段多种多样,用于说明请求的各个方面,如客户端信息、请求的内容类型、缓存策略等。以下是一些常见的HTTP请求头字段,但请注意,这并非所有可能…

手撕sql面试题:找出所有观看视频ID “1001“ 的观看时长大于他们观看视频ID “1002“ 的观看时长的用户ID

分享最近面试的sql面试题&#xff1a; 下面是表结构&#xff1a; CREATE TABLE video_records ( video_id char(4) NOT NULL COMMENT 视频id, user_id char(4) NOT NULL COMMENT 用户id, play_duration int NOT NULL COMMENT 观看时长, PRIMARY KEY (video_id,…

Ubuntu卸载已安装软件

前言 在Linux系统上安装了一些软件&#xff0c;但是卸载起来相比于Windows系统麻烦的多&#xff0c;这里总结了两种办法&#xff0c;希望对遇到这种问题的小伙伴能够有所帮助 1.Ubuntu Software 卸载 1.点击桌面上的Ubuntu Software并且选择installed 选中想要卸载的软件再按…

51. 【Android教程】JSON 数据解析

在上一节我们学习了 xml 数据格式&#xff0c;如果你觉得 xml 的数据比较冗余&#xff0c;标签、属性等等定义过于复杂&#xff0c;那么这一节我们将继续学习另一种更精简、更高效的数据格式—— Json。它广泛的运用于数据持久化以及网络传输中&#xff0c;这一节我们一起学习 …

CTF(Capture The Flag)编码方式

CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;编码和解码是常见的挑战类别之一&#xff0c;涉及到各种不同的编码方式。以下是一些CTF中可能出现的编码技术列表&#xff1a; Base系列编码&#xff1a; Base16&#xff08;Hexadecimal&#xff09;&#xff1a…

Hi3519AV100 处理器⾼速全局快⻔相机

⾼速全局快⻔相机采⽤ 1英⼨全局快⻔ Sensor&#xff0c;⽀持 H.264/H.265 编码&#xff0c;8 百万 分辨率模式下最⾼帧率可达 50 帧/秒&#xff0c;1080P 模式下最⾼帧率可达 120 帧/秒。主控采⽤ Hi3519AV100 处理器&#xff0c;集成 2 Tops AI 算⼒ NPU &#xff0c;⽀持⼤…

SGP.32-12

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 3.9 SM-DS Use 3.9.2.2 Event Retrieval by the eIM 在文档中提到的“通过eIM检索事件”的过程涉及了IoT设备中的IPA&#…