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.mzph.cn/news/165815.shtml

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

相关文章

123. 股票买卖的最佳时机III(2次交易)

题目 题解 class Solution:def maxProfit(self, prices: List[int]) -> int:N len(prices)# 状态定义 dp[i][j][k]代表在第i天,被允许完成j次交易时,持有或者不持有的最大利润。k0代表不持有,k1代表持有dp [[[0 for k in range(2)] for…

医学生秋招攻略,面试时一定要注意这些方面!

医学生别拖了,今年秋招已经过去一波热度了,赶早不赶晚!在筹备第二轮秋招以及明年的春招的医学生一定要注意以下事项。 1.清晰目标 搜集秋招讯息 一定要早点多做准备,想清楚未来的目标,是继续深造还是就业做医生或者是…

FileReader与URL.createObjectURL实现图片、视频上传预览

之前做图片、视频上传预览常用的方案是先把文件上传到服务器,等服务器返回文件的地址后,再把该地址字符串赋给img或video的src属性,这才实现所谓的文件预览。实际上这只是文件“上传后再预览”,这既浪费了用户的时间,也…

java开发合同相关

【点我-这里送书】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(…

集合的分类

Python内建的集合类,有有序和无序之分,还有可修改和不可修改之分。 1 有序和无序 有序是说某数据集合中的每个元素都有一个位置信息,通常用index表示,可以借助这种集合类型名和位置信息访问集合里的某元素值,在Pytho…

【开源】基于Vue.js的用户画像活动推荐系统

项目编号: S 061 ,文末获取源码。 \color{red}{项目编号:S061,文末获取源码。} 项目编号:S061,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活…

[Android]使用Git将项目提交到GitHub

如果你的Mac还没有安装Git,你可以通过Homebrew来安装它: brew install git 方式一:终端管理 1.创建本地Git仓库 在项目的根目录下,打开终端(Terminal)并执行以下命令来初始化一个新的Git仓库&#xff1…

vue3-组件传参及计算属性

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-组件传参及计算属性 目录 vue3中的组件传参 1、父传子 2、子传父 toRef 与 toRefs vue3中…

数据结构 查找基本概念

敬请期待。。。 1. 适用于折半查找的表的存储方式及元素排列要求为(顺序方式存储,元素有序 )。 2. 有一个按元素值排好序的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,比较次数分别是s和b&am…

拼接合并yuv序列转成mp4

ffmpeg需要用支持libx264的版本,如果需要,可以从这个网站下载编译支持libx264\x265的ffmpeg https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1-essentials_build.7z #-*- coding:utf-8-*- import osif __name__ "__main__":# 1 输入…

实例讲解:在3dMax中如何使用python脚本?

如果你是Python或Maxscript的新手,你现在可以跟着这篇文章开始做一些代码了,本文将让我们从非常基本的东西开始学习。 如何在3dmax中获取选定的节点并打印出它们的名称?所有场景对象如何?我们直接看代码: import MaxP…

Word/PPT/PDF怎么免费转为JPG图片?

1、打开金鸣表格文字识别网站。 2、点击导航条上的“软件下载” 3、安装并打开金鸣表格文字识别软件。 4、点击顶部导航栏的“文件转图片”。 5、选择需要转换成图片的文件(支持Word/PPT/PDF). 6、点“打开”程序将自动分页转换为图片。

【论文阅读笔记】Smil: Multimodal learning with severely missing modality

Ma M, Ren J, Zhao L, et al. Smil: Multimodal learning with severely missing modality[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(3): 2302-2310.[开源] 本文的核心思想是探讨和解决多模态学习中的一个重要问题:在训练和测…

【dart线程之怎么处理异步和顺序异步任务队列】

dart线程之怎么处理异步和顺序异步任务队列 单线程的dart怎么处理异步任务的? 事件循环模型就是实现异步处理任务的核心。 关于阻塞式调用和非阻塞式调用的概念 阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态阻塞式调用…

JS中的OOP

JS中的OOP OOP 为我们解决了什么问题?想象一下,我们希望为教师提供一个平台,每位注册的教师都可以提交分数,并为课程分配作业和其他内容。 如果有一个地方(在本例中是一个对象),可以访问所有教…

Python编写的爬虫为什么受欢迎?

每每回想起我当初学习python爬虫的经历,当初遇到的各种困难险阻至今都历历在目。即便当初道阻且长,穷且益坚,我也从来没有想过要放弃。今天我将以我个人经历,和大家聊一聊有关Python语音编写的爬虫的事情。谈一谈为什么最近几年py…

C#中的事件(委托的发布和订阅、事件的发布和订阅、EventHandler类、Windows事件)

目录 一、委托的发布和订阅 1.订阅操作符号“"和取消订阅操作符号“-” 2.示例源码 二、事件的发布和订阅 三、EventHandler类 四、Windows事件 C#中的事件是指某个类的对象在运行过程中遇到的一些特定事情,而这些特定的事情有必要通知给这个对象的使用者…

【海德教育】河北初级职称报名条件:

河北助理工程师 学历要求 大专毕业后满3年,工程类专业 本科毕业后满1年 ,工程类专业 非工程类专业,年限增加2年即可。

多线程,线程池,线程的创建,线程池的参数

文章目录 多线程-1 高并发〇、使用多线程的场景1. 为什么使用多线程 1. 线程概述1.1 线程和进程1.2 并发和并行1.3 多线程的优势1.4 程序运行原理1.5 主线程 1.6 线程的 6 种状态2. 线程的创建和启动2.1 Thread类2.2创建线程有哪几种方法2.2.1 继承**Thread**类,重写…

centos7 安装docker

1.卸载旧版本,不管装没装过,执行一下,防止版本冲突 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 2. yum安装gcc相关 以及 安…