python树的孩子链存储结构

news2024/11/27 4:32:52

树的孩子链存储结构是一种树的存储方式,它使用孩子兄弟表示法来表示树的结构。在这种存储结构中,树的每个节点都有一个指向其第一个孩子的指针和一个指向其下一个兄弟的指针。这样,可以通过这些指针来表示树的层次结构和节点之间的关系。

具体来说,对于每个节点,可以使用一个结构体来表示,其中包括节点的数据域以及指向其第一个孩子和下一个兄弟的指针。通过这种方式,可以轻松地遍历树的节点,查找节点的孩子和兄弟节点,以及进行其他操作。

树孩子链存储结构在一些应用中比较常见,特别是对于动态树结构的表示和操作,它可以提供比较灵活的存储方式,并且可以节省一定的存储空间。然而,由于需要额外的指针来表示孩子和兄弟节点的关系,可能会增加一定的存储开销,并且在一些操作上可能会比较复杂。因此,在选择树的存储结构时,需要根据具体的应用场景和需求来进行选择。

 代码:

class Node():
    def __init__(self,data=None):
        self.data=data
        self.next=None
class stree():
    def __init__(self):
        self.data=[]# 存储节点类

    # 传入结点进入存储的列表结构
    def creat(self,arr):# 将节点类创建并传入
        for i in range(len(arr)):
            p = Node(arr[i])
            self.data.append(p)

    # 建立节点和节点之间的关系
    def creat_s(self,i,j):#i为建立节点的下标,j为连接下标
        p = self.data[i]
        while p.next!=None:
            p = p.next
        q = Node(self.data[j].data)
        p.next=q

    # 遍历操作
    def display(self):
        for i in range(len(self.data)):
            if i==0:
                print(self.data[i].data,end=' ')
            p = self.data[i].next
            while p!= None:
                print(p.data,end=" ")
                p = p.next
        print()

    # 添加结点建立联系
    def add(self,i,e):# i为e的父节点下标
        # 将新节点添加进存储结构的操作
        q = Node(e)
        self.data.append(q)
        # 将新节点和对应i节点建立关系的操作
        p = self.data[i]
        while p.next != None:
            p = p.next
        c = Node(e)
        p.next = c

    # 删除对应i结点下标值为e的结点(方法要求不能删除父结点)
    def delx(self,i,e):
        p = self.data[i]
        while p.next.data!=e and p.next!=None:
            p = p.next
        p.next=p.next.next

    # 找到对应i结点下标值为e的结点,对其修改为值n_e
    def change(self,i,e,n_e):
        p = self.data[i]
        while p.data!=e and p!=None:
            p = p.next
        if p!=None:
            p.data=(n_e)

    # 查找对应i结点下标值为e的结点
    def find(self,i,e):
        p = self.data[i]
        while p.data != e and p != None:
            p = p.next
        if p != None:
            return p

a = stree()
a.creat(["A","B","C"])
a.creat_s(0,1)
a.creat_s(0,2)
a.display()
# a.add(0,'D')
# a.display()
# a.delx(0,'D')
# a.display()
# a.change(0,"C",'E')
# a.display()
# print(a.find(0,"E").data)

孩子链存储结构相对于其他树的存储结构,具有一些优势:

1. 灵活性:孩子链存储结构可以很容易地表示不规则的树形结构,因为每个节点只需存储其孩子节点和兄弟节点的指针,而不需要预先知道树的深度或者每个节点的孩子个数。

2. 节省空间:相对于其他存储结构,孩子链存储结构可以节省一定的空间,因为它不需要为每个节点都存储孩子节点的个数,只需存储指向孩子节点和兄弟节点的指针。

3. 动态性:孩子链存储结构适合表示动态树结构,因为它可以方便地插入或删除节点,而不需要移动整个树的结构。

4. 方便的遍历和操作:通过孩子链存储结构,可以方便地遍历树的节点,查找节点的孩子和兄弟节点,以及进行其他操作,如搜索、插入、删除等。

孩子链存储结构在某些情况下具有更好的适用性和效率,特别是对于动态树结构的表示和操作。然而,它也有一些缺点,比如可能会增加一定的存储开销,并且在一些操作上可能会比较复杂。因此,在选择树的存储结构时,需要根据具体的应用场景和需求来进行选择。

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

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

相关文章

前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

前言 当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 技术框架 vue、js、webpack 解决方案 编译项目时动…

C#、.net、asp.net 超快超简单(一看就会)将redis添加到自己的项目中

背景:凌晨两点,隔壁楼情侣闹得欢,本单身狗不服气,决定总结一下今晚添加到项目的redis。 我的使用场景:asp.net core web apivue3的项目中数据库的权限表是最经常读取的,所以权限表中的数据放到redis中最为…

java Swing UI设置统一字体大小

编写一个遍历组件设置字体大小的方法 public static void setUIFont() {Font f new Font("宋体", Font.PLAIN, 18);String names[] {"Label", "CheckBox", "PopupMenu", "MenuItem", "CheckBoxMenuItem", &quo…

基于springboot+Web实现社区医院管理服务系统项目【项目源码+论文说明】

基于springbootWeb实现社区医院管理服务系统演示 摘要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括社区医院管理服务系统的网络应用,在外国线上管理系统已经是很普遍的方式,不过国内的管理系统可…

SAP是什么公司,开发什么系统软件?

SAP 是公司原德语名称 Systemanalyse Programmentwicklung 的首字母缩写,意思是系统分析程序开发 (System Analysis Program Development) 。现在,公司的注册名称为 SAP SE,其中 SE 代表 societas Europaea,是指根据欧盟公司法注册…

有关循环依赖和三级缓存的这些问题,你都会么?(面试常问)

一、什么是循环依赖 大家平时在写业务的时候应该写过这样的代码。 其实这种类型就是循环依赖,就是AService 和BService两个类相互引用。 二、三级缓存可以解决的循环依赖场景 如上面所说,大家平时在写这种代码的时候,项目其实是可以起来的&am…

leetcode:有效的括号

题目描述 题目链接:20. 有效的括号 - 力扣(LeetCode) 题目分析 题目给了我们三种括号:()、{ }、[ ] 这里的匹配包括:顺序匹配和数量匹配 最优的思路就是用栈来解决: 括号依次入栈…

Java核心知识点整理大全17-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

vue 中 js 金额数字转中文

参考:js工具函数之数字转为中文数字和大写金额_js封装工具类函数金额大写-CSDN博客 我使用的框架vol.core。 客户需求要将录入框的金额数字转换成中文在旁边显示,换了几种函数,最终确定如下函数 function changeToChineseMoney(Num) {//判断…

Drool 7 SpreadSheet Decision Template 笔记

1 Excel Decision table 1.1 很棒的示意图,来自https://blog.csdn.net/justlpf/article/details/128109731 1.2 参考URL 1.2.1 https://blog.csdn.net/justlpf/article/details/128109731 1.3 多sheet 模式 默认是用第一个sheet如果要支持多sheet,需…

2023年【通信安全员ABC证】考试题及通信安全员ABC证证考试

题库来源:安全生产模拟考试一点通公众号小程序 2023年【通信安全员ABC证】考试题及通信安全员ABC证证考试,包含通信安全员ABC证考试题答案和解析及通信安全员ABC证证考试练习。安全生产模拟考试一点通结合国家通信安全员ABC证考试最新大纲及通信安全员A…

8.0 泛型

通过之前的学习,读者可以了解到,把一个对象存入集合后,再次取出该对象时,该对象的编译类型就变成了Object类型(尽管其在运行时类型没有改变)。集合设计成这样,提高了它的通用性,但是…

Java 基础学习(一)Java环境搭建和基本数据类型

1 Java 开发环境搭建 1.1 Java 编程语言 1.1.1 什么是Java编程语言 语言是人类进行沟通交流的各种表达符号,方便人与人之间进行沟通与信息交换;而计算机编程语言则是人与计算机之间进行信息交流沟通的一种特殊语言,也有语法规则、字符、符…

嵌入式八股 | 笔试面试 | 校招秋招 | 题目精选

嵌入式八股精华版1.0所有216道题目如下: 欢迎关注微信公众号【赛博二哈】并加入嵌入式求职交流群。提供简历模板、学习路线、岗位整理等 欢迎加入知识星球【嵌入式求职星球】获取完整嵌入式八股。 提供简历修改、项目推荐、求职规划答疑。另有各城市、公…

vue3使用TinyMCE富文本

TinyMCE 介绍 TinyMCE 是一个功能强大的富文本编辑器,它允许您在网页应用程序中创建和编辑具有丰富格式的内容。官网 github项目地址 文档地址 下载tinymce文件 从网页下载最新版zip,也可以打开下面链接下载。 打开网页 tinymce.zip zh-Hans 将下载…

什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch

前言 在FPGA设计中,几乎没人会主动使用锁存器Latch,但有时候不知不觉中你的设计莫名其妙地就生成了一堆Latch,而这些Latch可能会给你带来巨大的麻烦。 什么是锁存器Latch? Latch,锁存器,一种可以存储电路…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法,可以用于检测图像中的人行道-斑马线。在目标检测领域,YOLOv5通过结合多种技术手段,包括使用Mosaic数据增强操作、自适应锚框计算与…

Blender学习笔记:做一个小车

文章目录 轮廓车窗轮胎和车灯 教程地址:八个案例教程带你从0到1入门blender【已完结】 轮廓 1 创建立方体,将其拉伸成长方体。Tab进入编辑模式;CtrlR添加一个纵向的循环边;3进入面模式;E选中后上方的面向上拉伸&…

直播自动互动发言机器人,成功分享与技术实现思路

先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、引言 在当今的互联网时代,直播间已经成为了一个重要的营销和交流平台。为了提高直播间的关注度和人气,我们需要在直播过程中注重提高停留和增加人气。本…

Portraiture全新4.1.2版本升级更新

关于PS修图插件,相信大家都有安装过使用过,而且还不止安装了一款,比如最为经典的DR5.0人像精修插件,Retouch4me11合1插件,Portraiture磨皮插件,这些都是人像精修插件中的领跑者。其中 Portraiture 刚刚升级…