python树长子兄弟链存储结构(孩子兄弟链存储结构)

长子兄弟链存储结构(孩子兄弟链存储结构)解释:

        长子兄弟链存储结构是一种树的存储结构,它使用孩子兄弟表示法(也称作左孩子右兄弟表示法)来表示树的结构。这种表示方法主要用于存储一般的树,而不是二叉树。

        在长子兄弟链存储结构中,树中的每个节点都有两个指针:一个指向它的第一个孩子节点,另一个指向它的右边(兄弟)的节点。这种表示方法使用了类似链表的结构,使得树的每个节点可以灵活地连接到它的子节点和兄弟节点。

        使用长子兄弟链存储结构,可以有效地表示任意形状的树,而且在进行树的遍历和操作时也相对容易。这种存储结构的主要优点是节省空间,因为不需要额外的指针来表示左右子树,同时也便于实现树的各种操作,如插入、删除和查找等。长子兄弟链存储结构在树的应用中具有一定的灵活性和效率。

 代码:

class BENode():
    def __init__(self,data,son=None,brother=None):
        self.data=data
        self.son=son
        self.brother=brother

class BEStree():
    def __init__(self):
        self.data=[]

    # 建立根节点,并存储在self.data中
    def create_t(self,e):
        a = BENode(e)
        self.data.append(a)

    # 建立节点与节点之间关系,并存储在self.data中,brother的存储优先级<son的存储优先级(增加节点)
    def create_other(self,i,son=None,brother=None):#i为节点的下标
        if son!=None:
            s = BENode(son)
            self.data.append(s)
            self.data[i].son = s
        if brother!=None:
            b = BENode(brother)
            self.data.append(b)
            self.data[i].brother=b

    # 删除节点值
    def delx(self,e):
        for i in range(len(self.data)):# 从节点属性删除节点值
            if self.data[i].brother != None:
                if self.data[i].brother.data==e:
                    self.data[i].brother.data=None
                    break
            if self.data[i].son != None:
                if self.data[i].son.data==e:
                    self.data[i].son.data=None
                    break
        for i in range(len(self.data)):# 从存储结构删除
            if self.data[i].data==e:
                self.data[i].data=None
                break

    #修改节点值,将e修改为n_e
    def change(self,e,n_e):
        for i in range(len(self.data)):# 从节点属性修改节点值
            if self.data[i].brother!=None:
                if self.data[i].brother.data==e:
                    self.data[i].brother.data=n_e
                    break
            if self.data[i].son != None:
                if self.data[i].son.data==e:# 从存储结构修改
                    self.data[i].son.data=n_e
                    break
        for i in range(len(self.data)):
            if self.data[i].data==e:
                self.data[i].data=n_e
                break

    # 查询节点值,返回节点
    def find(self,e):
        for i in range(len(self.data)):
            if self.data[i].data==e:
                return self.data[i]

    #先序遍历,传入的t的参数为self.data[0]
    def display_f(self,t):
        if t!=None:
            print(t.data,end=' ')
            self.display_f(t.son)
            self.display_f(t.brother)

    #后序遍历
    def display_t(self,t):
        if t!=None:
            self.display_t(t.son)
            self.display_t(t.brother)
            print(t.data,end=' ')

    #中序遍历
    def display_m(self,t):
        if t!=None:
            self.display_m(t.son)
            print(t.data,end=' ')
            self.display_m(t.brother)

a = BEStree()
a.create_t('A')
a.create_other(0,'B')
a.create_other(1,'D','C')
a.create_other(2,'G')
a.create_other(3,'E')
a.create_other(5,None,'F')
#后序遍历
a.display_t(a.data[0])
print()
#中序遍历
a.display_m(a.data[0])
print()
#先序遍历
a.display_f(a.data[0])
print()
# 改变值
a.change('A',"10")
a.display_f(a.data[0])
print()
# 删除值
a.delx('10')
a.display_f(a.data[0])

长子兄弟链存储结构的优点:

        1. 节省空间:相比于其他树的存储结构,长子兄弟链存储结构更加节省空间,因为它不需要额外的指针来表示左右子树。

        2. 灵活性:长子兄弟链存储结构可以有效地表示任意形状的树,包括多叉树和不规则树,因此具有较强的灵活性。

        3. 操作便利:在长子兄弟链存储结构中,树的节点之间使用指针连接,这样可以方便地进行树的遍历、插入、删除和查找等操作。

长子兄弟链存储结构的缺点:

        1. 操作复杂性:相对于其他树的存储结构,长子兄弟链存储结构的操作可能会更加复杂,因为需要考虑节点之间的兄弟关系和孩子关系。

        2. 不适用于特定场景:长子兄弟链存储结构主要适用于一般的树结构,对于特定的树,如二叉树或平衡树等,可能不是最佳的选择。

        3. 不适合频繁修改的树:长子兄弟链存储结构对于频繁进行插入和删除操作的树可能不太适用,因为这样的操作可能会导致链的频繁调整,影响效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【华为OD】B\C卷真题:100%通过:找城市 C/C++实现

【华为OD】B\C卷真题&#xff1a;100%通过&#xff1a;找城市 C/C实现 题目描述&#xff1a; 一张地图上有n个城市&#xff0c;城市和城市之间有且只有一条道路相连&#xff1a;要么直接相连&#xff0c;要么通过其它城市中转相连&#xff08;可中转一次或多次&#xff09;。…

智能优化算法应用:基于麻雀算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于麻雀算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于麻雀算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.麻雀算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Typescript基础面试题 | 01.精选 ts 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

摄像馆服务预约管理系统会员小程序作用是什么

摄像馆不少人并不会经常去&#xff0c;除了有拍婚纱照或工作照等&#xff0c;一般很少会进店&#xff0c;但由于摄像涵盖多个服务项目&#xff0c;因此总体来讲&#xff0c;市场需求度还是比较高的&#xff0c;一个城市也有多个品牌&#xff0c;而传统门店经营也面临不少痛点。…

stm32 42步进电机 上位机示例

脉冲到底是个啥东西&#xff1f;步进电机一直说发脉冲 步进电机通过接收脉冲信号来实现精确的位置控制。脉冲是一种短暂的电信号&#xff0c;它的变化可以触发步进电机转动一定的角度或步进。步进电机控制系统会根据输入的脉冲信号来精确定位和控制步进电机的转动&#xff0c;每…

Datax安装部署及读取MYSQL写入HDFS

一.DataX简介 1.DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/Data…

⑩【Redis Java客户端】:Jedis、SpringDataRedis、StringRedisTemplate

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Jedis、SpringDataRedis、StringRedisTemplate…

数据结构——线性表

目录 1.线性表的定义 2.顺序表 2.1顺序表的定义 2.2 顺序表的应用 2.2.1 顺序表的管理 &#xff08;1&#xff09; 顺序表的初始化 &#xff08;2&#xff09; 销毁顺序表 &#xff08;3&#xff09; 打印顺序表的值 &#xff08;4&#xff09;检查顺序表的容量 &…

C#文件操作File类vsFileInfo类和Directory类vsDirectoryInfo类

目录 一、File类vsFileInfo类 1.File类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.FileInfo类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 二、 Directory类vsDirectoryInfo类 1.Directory类 &#xff08;…

C语言基础介绍

1. C语言基础知识 C语言是一种计算机编程语言&#xff0c;是一门用于编写系统软件和应用软件的高级语言。C语言的基础知识包括&#xff1a; 数据类型&#xff1a;C语言中的数据类型包括整型、浮点型、字符型等。 变量&#xff1a;C语言中使用变量来存储数据&#xff0c;变量必…

量化交易:因子风险暴露

本文介绍了如何计算因子风险暴露的内容。 判断风险暴露的建模是否合理 通常&#xff0c;此分析是基于历史数据&#xff0c;而对历史风险暴露的估计可能会影响未来的风险暴露。 因此&#xff0c;计算因子风险暴露是不够的。 必须对风险暴露保持信心&#xff0c;并明白对风险暴…

Vue框架学习笔记——键盘事件

文章目录 前文提要键盘事件&#xff08;并不是所有按键都能绑定键盘事件&#xff09;常用的按键不同的tab和四个按键keyCode绑定键盘事件&#xff08;不推荐&#xff09;Vue.config.keyCode.自定义键名 键码 神奇的猜想div标签和click.enterbutton标签和click.enter 前文提要 …

定长子网划分和变长子网划分问题_二叉树解法_通俗易懂_配考研真题

引入:定长子网划分和变长子网划分的基本概念 定长子网划分和变长子网划分的基本概念 目前常用的子网划分&#xff0c;是基于CIDR的子网划分&#xff0c;也就是将给定的CIDR地址块划分为若干个较小的CIDR地址块。 定长子网划分: 使用同一个子网掩码来划分子网&#xff0c;因…

【版本管理 | Git】Git rebase 命令最佳实践!确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

智能优化算法应用:基于斑点鬣狗算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于斑点鬣狗算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于斑点鬣狗算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑点鬣狗算法4.实验参数设定5.算法结果6.参考…

VM虚拟机中Ubuntu14.04安装VM tools后仍不能全屏显示

1、查看Ubuntu所支持的分辨率大小。 在终端处输入&#xff1a; xrandr&#xff0c;回车 2、输入你想设置的分辨率参数。 我设置的为1360x768&#xff0c;大家可以根据自己的具体设备设置。 在终端输入&#xff1a;xrandr -s 1360x768 注意&#xff1a;这里1360后边是字母 x 且…

<JavaEE> Thread线程类 和 Thread的常用方法

目录 一、Thread概述 二、构造方法 三、常用方法 1.1 getId()、getName()、getState()、getPririty() 1.2 start() 1.3 isDaemon()、setDaemon() 1.4 isAlive() 1.5 currentThread() 1.6 Interrupt()、interrupted()、isInterrupted() 1.6.1 方法一&#xff1a;添加共…

S25FL系列FLASH读写的FPGA实现

文章目录 实现思路具体实现子模块实现top模块 测试Something 实现思路 建议读者先对 S25FL-S 系列 FLASH 进行了解&#xff0c;我之前的博文中有详细介绍。 笔者的芯片具体型号为 S25FL256SAGNFI00&#xff0c;存储容量 256Mb&#xff0c;增强高性能 EHPLC&#xff0c;4KB 与 6…

Java中static、final、static final的区别

文章目录 finalstaticstatic final final final可以修饰&#xff1a;属性&#xff0c;方法&#xff0c;类&#xff0c;局部变量&#xff08;方法中的变量&#xff09; final修饰的属性的初始化可以在编译期&#xff0c;也可以在运行期&#xff0c;初始化后不能被改变。 final修…

nginx配置文件的简单结构

nginx的配置文件&#xff08;nginx.conf&#xff09;整体上可分为三个部分&#xff1a;全局块、events块、http块 区域职责全局块配置和nginx运行相关的全局配置events块配置和网络连接相关的配置http块配置代理、缓存、日志记录、虚拟主机等配置在http块中&#xff0c;可以包含…