python树的双亲存储结构

news2024/11/13 10:35:37

这种存储结构是一种顺序存储结构,采用元素形如“[结点值,双亲结点索引]”的列表表示。通常每个结点有唯一的索引(或者伪地址),根结点的索引为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 = 1
    while parent[i] != -1:
        cnt += 1
        i = 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_name
                break
    #查找节点
    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.coloradmin.cn/o/1245667.html

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

相关文章

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

Cobalt Strike之反向上线操作

前言 ​ Cobalt Strike 使用 GUI 框架 SWING(一种java GUI的库)开发,攻击者可通过CS木马在 beacon 元数据中注入恶意 HTML 标签,使得Cobalt Strike对其进行解析并且加载恶意代码(类似XSS攻击),…

【Proteus仿真】【51单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能: 系统运行后&#xf…

【LeetCode刷题笔记】DFSBFS(三)

图的基础知识 邻接矩阵是一个二维表,其中横纵坐标交叉的格子值为 1 的表示这两个顶点是连通的,否则是不连通的。

BUUCTF [ACTF新生赛2020]outguess 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到一堆文件。 解题思路: 1、根据题目和flag.txt文件提示,猜测为outguess隐写。 outguess下载安装 kail 终端命…

竞赛YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…

IP 代理的基础知识有哪些?

本文将介绍流冠IP代理的基础知识,帮助您了解IP代理的概念、类型、作用、设置方法和注意事项。 一、IP代理的概念 IP代理是一种网络代理服务,它通过代理服务器帮助用户访问互联网,并将用户的请求转发到目标网站,同时将目标网站的响…

技术面时,一定要掌握这3个关键点

前言 现在有这么多优秀的测试工程师,大家都知道技术面试是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察你的技术功底与基础理论知识。 如果你参加过一些大厂面试,肯定会遇到一些这样的问题: 1、看你项目都用到了…

TCP/IP协议:最流行的电子邮件协议SMTP(简单邮件传输协议)详解

SMTP 是一种电子邮件协议,用于通过互联网从一个电子邮件帐户向另一个电子邮件帐户发送电子邮件。它是TCP/IP协议应用层的一部分。作为一种电子邮件协议,它建立了不同电子邮件客户端和帐户之间轻松信息交换的规则。这样,简单邮件传输协议就可以…

【SpringBoot系列】SpringBoot日志配置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

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

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

【C++学习手札】模拟实现list

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:リナリア—まるりとりゅうが 0:36━━━━━━️💟──────── 3:51 🔄 ◀️ ⏸ ▶️…

深入理解计算机系统(原书第三版)PDF 高清中文版

深入理解计算机系统 PDF 深入理解计算机系统 pdf, 这本书的全名是:Computer Systems:A Programmer’s Perspective(所以它又被称为 CSAPP),个人习惯把它翻译为程序员所需了解的计算机系统知识,尽…

基于GPRS的汽车碰撞自动报警系统(论文+源码)

1. 系统设计 本次基于GPRS的汽车碰撞自动报警系统的设计中,其主要的目标功能如下:1、实时检测当前的GPS精度和纬度坐标;2.当发生碰撞后系统自动将当前的信息通过GPRS数据发送到远端数据进行报警;3、系统在碰撞后一方面进行本地报警…

运放如何进行全波整流

对于一个双极性的交流信号,如果想要把负半轴的信号镜像到正半轴,我们可以接一个整流桥,这种叫做全波整流。 如果双极性的交流信号经过一个二极管,则交流信号的负半轴不能通过二极管,输出只有正半轴的信号,这…

【UE5】五大基类及其使用

UObject UObject表示对象,准确来说,虚幻引擎中的对象基础类为UObject UObject提供了以下功能: 垃圾收集(Garbage collection)引用自动更新(Reference updating)反射(Reflection&am…

【面试送分题!“商品分类浏览”如何测试?】

电商项目无论是工作中,还是面试中,都是一个高频出现的词。 面试官非常热衷提问关于电商项目的问题。例如商品分类怎么测试?购物车怎么测试?订单怎么测试?优惠券怎么测试?支付怎么测试?等等。 …

多功能回馈式交流电子负载的应用

多功能回馈式交流电子负载是用于模拟和测试电源、电池等电子设备的负载工具。它具有多种应用,可以用于测试和评估各种类型的电源,包括直流电源和交流电源。它可以模拟各种负载条件,如恒定电流、恒定电压和恒定功率,以验证电源的性…

ubuntu22.04 git 安装

安装git:默认情况下,Git 在 ubuntu 22.04 基础存储库中可用。 现在运行以下命令在您的 Ubuntu 系统上安装最新版本的 Git: 查看当前版本号 git --version

第五天 用Python批量处理Excel文件,实现自动化办公

用Python批量处理Excel文件,实现自动化办公 一、具体需求 有以下N个表,每个表的结构一样,如下: 需要把所有表数据汇总,把每个人的得分、积分分别加起来,然后按总积分排名,总积分一致时&#xff…