python树的双亲存储结构

这种存储结构是一种顺序存储结构,采用元素形如“[结点值,双亲结点索引]”的列表表示。通常每个结点有唯一的索引(或者伪地址),根结点的索引为0,它没有双亲结点,其双亲结点的索引为-1。例如,所示的树对应的双亲存储结构如下:
#树的双亲存储结构

t=[["A",-1],["B",0],["C",0],["D",1],["E",1],["F",1],["G",4]]


在该存储结构t中,索引为i的结点是t[i],其中t[i][0]为结点值,t[i][1]为该结点的双亲结点的索引。

若一棵树采用双亲在储结构存储,设计一个算法求指定索引是i的结点的层次。
解:用cnt 表示索引i的结点的层次(初始为1)。沿着双亲指针向上移动,当没有到达根结点时循环:cnt 增1,i向上移动一次。当到达根结点时cnt 恰好为原索引i结点的层次,最后返回cnt。对应的算法如下:


```python
def find_level(parent, i):cnt = 1while parent[i] != -1:cnt += 1i = parent[i]return cnt
```

 python树的双亲存储结构:

class FNode():def __init__(self,name=None,i=None):#name为数据,i为其对应的父节点下标self.node=[name,i]
class ftree():#存储节点数据def __init__(self):self.data=[]#增加def add(self,name,i):#添加节点数据进入数的结构p = FNode(name,i)#建立节点self.data.append(p.node)#添加进入#创建def CreateTree(self,arr):#传入对应数据建立数arr为一个树关系的二维列表for i in arr:self.data.append(i)#删除def Dex(self,name,i):#给出节点的name和i进行删除for j in range(len(self.data)):if self.data[j][0]==name and self.data[j][1]==i:self.data.pop(j)break# 修改节点数据def alter(self,name,i,n_name):for j in range(len(self.data)):if self.data[j][0]==name and self.data[j][1]==i:self.data[j][0]=n_namebreak#查找节点def find(self,name,i):for j in range(len(self.data)):if self.data[j][0]==name and self.data[j][1]==i:return self.data[j]#遍历树结构,双亲存储单位的结构决定了它只能层次遍历def display(self):for i in range(len(self.data)):print(self.data[i][0],end=" ")print()t = [['A',-1],['B',0],['C',0],['D',1],['E',1],['F',1],['G',4]]
tree_1 = ftree()
tree_1.CreateTree(t)
tree_1.display()
tree_1.add('H',4)
tree_1.display()
tree_1.Dex('H',4)
tree_1.display()
tree_1.alter('G',4,'5')
tree_1.display()
print(tree_1.find('A',-1))

双亲存储结构利用了每个结点(根节点除外)有啡一双亲的性质。在这种存储结构
中,求某个结点的双亲结点十分容易,但求某个结点的孩子结点时需要遍历整个结构。

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

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

相关文章

qgis添加postgis数据

左侧浏览器-PostGIS-右键-新建连接 展开-双击即可呈现 可以点击编辑按钮对矢量数据编辑后是直接入库的,因此谨慎使用。

Rust语言入门教程(一) - 简介及Cargo使用

Rust编程入门 为什么学习Rust 我本人是一个DevOps工程师,并不是专职的开发人员,但需要了解各种各样的语言的基本知识和特性,以便在不同的项目中帮助开发人员设计软件架构,部署流程以及进行错误排查和调试。但是对任何新生的优秀…

聚观早报 |一加12正式开启预订;OPPO Reno11系列卖点

【聚观365】11月24日消息 一加12正式开启预订 OPPO Reno11系列卖点 小鹏第三季度营收财报 Claude 2.1 聊天机器人公布 现代汽车将与伦敦大学学院合作 一加12正式开启预订 全新的一加12系列公开亮相已有一段时间,不久前一加官方宣布,该机将于12月4日…

【JavaWeb】HTMLCSSJavaScript

HTML&CSS&JavaScript 文章目录 HTML&CSS&JavaScript一、开发工具及在线帮助文档二、 HTML2.1 HTML&CSS&JavaScript的作用2.2 HTML基础结构2.3 HTML概念词汇解释2.4 HTML的语法规则2.5 常用标签 三、CSS3.1 引入方式3.2 CSS选择器3.3 CSS浮动3.4 CSS定位…

【JavaScript】3.1 项目实践:制作一个简单的网页应用

文章目录 项目需求HTML结构JavaScript逻辑添加待办事项标记待办事项删除待办事项保存待办事项 总结 在此章节中,我们将学习如何使用JavaScript创建一个简单的网页应用。这将是一个待办事项列表应用,用户可以添加新的待办事项,标记已完成的事项…

使用Python实现银行管理系统

使用Python实现银行管理系统 题目介绍程序演示登录开户查询取款存款转账锁定解锁存盘退出 相关代码开户功能查询功能取款功能存款功能转账功能锁定功能解锁功能存盘功能加载存盘的数据登录/登出功能主程序 完整代码 在本篇博文中,我们将使用Python编写一个简单的银行…

MySQL 8 配置文件详解与最佳实践

MySQL 8 是一款强大的关系型数据库管理系统,通过适当的配置文件设置,可以充分发挥其性能潜力。在这篇博客中,我们将深入探究 MySQL 8 常用的配置文件,并提供一些建议,帮助您优化数据库性能。 配置文件概览 在 MySQL …

GPT、GPT-2、GPT-3论文精读笔记

视频:GPT,GPT-2,GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili MAE论文:把bert用回计算机视觉领域 CLIP论文:打通文本和图像 GPT 论文:Improving Language Understanding by Generative Pre-Training …

机器学习笔记 - 复杂任务的CNN组合

基础CNN架构可通过多种方式进行组合和扩展,从而解决更多、更复杂的任务。 1. 分类和定位 在分类和定位任务中,你不仅需要说出在图像中找到的物体的类别,而且还需指出物体显现在图像中的边界框坐标。这类任务假设在图像中只有一个物体实例。 这个任务可通过在典型的分类网络…

Java Web 实战 21 - 用 Servlet 实现一个Hello World

用 Servlet 来写一个 Hello World~ 一 . 基本部署方式1.1 创建 Servlet 项目1.2 引入依赖1.3 创建目录1.4 编写代码继承 HttpServlet重写 doGet 方法删除 super 方法加上 WebServlet 注解写业务逻辑 1.5 打包1.6 部署1.7 验证1.8 小结 二 . 更方便的部署方式2.1 Smart Tomcat 的…

【免费】小傅哥 DDD 开发小册

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 大家好,我是技术UP主小傅哥。 如果在面试的时候,面试官问你DDD是什么,你怎么解释&#xff1…

Windows下安装Anaconda3并使用JupyterNoteBook

下载安装包 Anaconda官网 进官网,点击下载 自动根据当前系统下载对应的包了,安装包大约1G,喝杯Java耐心等待。 安装 很多人安装C盘,我这里放D盘。 注意:你的文件夹目录一定要不能有空格 然后其他的直接默认install即…