树的储存结构和表示法_20230506

news2024/11/17 17:31:32

树的储存结构和表示法

  1. 前言

树是一类非常重要的数据结构,它是图和其它更高阶数据的基础,人们对树的储存结构和表示法进行了大量研究,这里介绍三种常见的链表结构来表示树的基本方法。

  1. 树的双亲表示法

假设以一组连续空间储存数据的结点(比如数组或malloc动态分配的空间),同时在每个结点中附设一个指示其双亲结点在链表中的位置的指示器,那么就可以通过结点的遍历,不断双亲,直至遍历完成,为了方便程序设计,约定根节点的双亲序号为‘-1’,如果程序找到双亲为-1的结点,那么就意味着遍历结束。

定义结点结构,双亲结点中包含基本的数据域和父节点位置编号,位置编号定义为parent.

#define MAX_TREE_SIZE 100
typedef struct PTNode
{
    TElemType data;
    int parent;
}PTNode;

定义树结构,之前提到了用一组连续储存空间来储存结点,为了方便,采用结点结构 的数组来表示树的结构,

//树结构
typedef struct PTree
{
    PTNode nodes[MAX_TREE_SIZE];
    int r;//r 代表根结点位置
    int n; //n 代表结点实际数量,n≤MAX_TREE_SIZE
}

下图展示一棵树的双亲表示以及数据储存结构。

在这里插入图片描述

在这里插入图片描述

  1. 孩子表示法

双亲表示法中,求孩子结点时候需要遍历整个树的结构。于是人们发明了孩子表示方法的数据结构。

由于树中每个结点可能有多颗子树,则可用多重链表,也即每个结点有多个指针域,其中每个指针指向一棵树的根节点,此时链表中的结点可以有以下两种格式:

datachild_1child_2child_3child_4child_d

如若采用上述结构,所有结点都是同构的,其中d为树的度。由于很多结点的实际子树数量小于d,所以链表中有很多空域,空间较为浪费。

为了节省空间,也可采用另外格式的结点结构,对于每个几点,标明此结点当中实际度数,也就是子孩子的实际数量,勾画出结点结构。

datadegreechild_1child_2child_3child_degree

如若采用此结构,多重链表的结点不同构,导致操作不方便。

除了多重链表,另外一种办法就是把每个结点的孩子结点排列起来,看作一个线性表,则n个结点就有n个线性表。n个头指针(头指针和数据域构成 前置结点)又组成一个线性表,为了便于查找,头指针可采用顺序储存结构。

孩子结点的数据结构采用链表形式,包含孩子所在的位置编号或下标,同时创建next指针,把所有的孩子结点都串起来。

//孩子结点
typedef struct CTNode
{
    int child;
    struct CTNode *next;
}CTNode, *ChildPtr;

//头结点结构
typedef struct CTBox
{
    TElemType data;
    ChildPtr firstchild;
}CTBox;

//树结构
typedef struct CTree
{
    CTBox nodes[MAX_TREE_SIZE];
    int r;//r 代表根结点位置
    int n; //n 代表结点实际数量,n≤MAX_TREE_SIZE
}CTree;

左边树的孩子链表表示法,如右图,它本质上是线性表和链表结合,头结点指针构成线性表,孩子结点则采用链表的结构来表示,充分发挥了两类表结构的优势。

在这里插入图片描述

与双亲表示法相反,孩子表示法便于实现那些和孩子遍历或访问相关的操作,不适用于向上访问的基本操作。

  1. 孩子兄弟表示法

此表示法是利用二叉链表结构来表示树,方式比较灵活。链表结点中除了数据域,还包含两个指针域,分别指向结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild和nextsibling域。

typedef struct CSNode
{
    TElemType data;
    struct CSNode *firstchild;
    struct CSNode *nextsibling;
}CSNode,*CSTree;

若要访问结点x的第i个孩子,则只要先从firstchild域找到第一个孩子结点,然后沿着孩子结点的nextsibling域继续走i-1步,便可以找到x结点的第i个孩子。当然也可以增设一个parent域,方便实现双亲结点的查找和访问等相关工作。

右边的孩子兄弟链表是对左边树的具体表示。
在这里插入图片描述

  1. 小结

本文回顾了树的常见的三种表示方法,并学习了不同表示方法的优缺点,通过回顾,巩固了已经学习的 知识,同时加深了对树的表示的理解。

参考资料:

  • 《数据结构》严蔚敏

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

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

相关文章

MySQL基础(六)多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,…

密码学【java】初探究加密方式之非对称加密

文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5.1 **保存公钥和私钥**5.2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。与对…

argument type mismatch

后端接收前端传来的数据 id,进行批量删除,报错如下: 错误一 removeByIds(ids) com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.IllegalArgumentException: argument type mismatch at com.baomidou.mybati…

华为OD机试 - 各位相加(Java)

一、题目描述 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。 二、思路与算法 各位相加,使用递归,出口是结果的长度等于1。 三、Java算法源码 public static int addDigits(int num) {recursion(num);re…

vs2017如何创建一个asax文件

VS2017无法为网站创建Global.asax文件,导致出现错误WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。 解决方案如下: 勾选要应用的网站,这里我要应用的是ExSite 点击安装,然后点击确定即可。 此时&am…

单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

CAN总线和RS-485总线作为常用的工业通信总线,在许多工业领域中得到广泛使用。但随着工业应用的不断扩展和网络化的需求增加,它们面临着一些局限性。例如CAN总线虽然具有较高的通信速率和可靠性,但存在节点数量受限、数据传输距离短等问题。而…

Nginx总结

目录 Nginx介绍 Nginx的作用 反向代理 项目架构 实战:访问nginx服务器反向代理到另一台虚拟机上的tomcat服务器 负载均衡 项目架构 实战:访问nginx服务器,是否反向代理到集群中的任意一台tomcat服务器,停止一台tomcat服务器&…

JAVA16新特性

JAVA16新特性 概述 2021年3月16日正式发布,一共更新了17JEP https://openjdk.java.net/projects/jdk/16/ 一 语法层面 1_JEP 397:密封类(第二次预览) sealed class 第二次预览 通过密封的类和接口来增强Java编程语言,这是新的预览特性,用…

stream的collectors

起因的话&#xff0c;新进公司&#xff0c;看见了一段有意思的代码。 public final class MyCollectors {private MyCollectors() {}static final Set<Collector.Characteristics> CH_ID Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_F…

开源中国面试准备

dockerFile常见命令 1、FROM 设置要制作的镜像基于哪个镜像&#xff0c;FROM指令必须是整个Dockerfile的第一个指令&#xff0c;如果指定的镜像不存在默认会自动从Docker Hub上下载 2、MAINTAINER 镜像作者的信息&#xff0c;比如名字或邮箱地址 语法&#xff1a;MAINTAINER n…

HTTP第三讲——四层模型、七层模型

四层模型 TCP/IP 协议&#xff0c;它是 HTTP 协议的下层协议&#xff0c;负责具体的数据传输 工作。TCP/IP 协议是一个“有层次的协议栈”。 TCP/IP 当初的设计者真的是非常聪明&#xff0c;创造性地提出了“分层”的概念&#xff0c;把复杂的网络通信划分出多个层次&#xff…

免费矢量图标网站有哪些?

图标作为UI设计的必要元素&#xff0c;矢量图标是质量的保证。据说完美的用户体验应该从灵活性开始 。在响应设计盛行的当下&#xff0c;灵活矢量图标的重要性不言而喻。在这种情况下&#xff0c;风格齐全、质量上乘的矢量图标网站堪称设计宝藏。在这篇文章中&#xff0c;我们…

基于springboot的医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

读书笔记--数据治理之法

继续延续上一篇文章&#xff0c;对数据治理之法进行学习。数据治理之法是战术层面的方法&#xff0c;是一套涵盖8项举措的数据治理实施方法论&#xff0c;包括梳理现状与确定目标、能力成熟度评估、治理路线图规划、保障体系建设、技术体系建设、治理策略执行与监控、绩效考核与…

c++学习:STL之string类初识

目录 1.关于STL 1.什么是STL 2.STL的六的组件 2.关于string类的学习 1.为何学习string类 2.何为string类 3.string类对象的构造 4.容量操作 5.元素访问的操作 6.迭代器&#xff08;Iterators&#xff09; 7.修改类的操作 8.字符串操作 1.关于STL 1.什么是STL STL&a…

理解多态的实现原理

目录 概念&#xff1a; 特例&#xff1a; 协变&#xff1a; final&#xff1a; override: 抽象类、纯虚函数&#xff1a; 查表&#xff1a; 动态绑定&#xff1a; 概念&#xff1a; 就是多个不同的对象&#xff0c;在完成某种相同动作时&#xff0c;会产生多种不同的状态…

佩戴更舒适的骨传导耳机,音质也很出色,南卡 NEO体验

现在天气越来越好&#xff0c;特别适合户外运动&#xff0c;很多人跑步健身时都喜欢戴上一副骨传导耳机&#xff0c;听音乐的同时&#xff0c;还可以随时留意周围的交通状况。在国产的骨传导耳机里面&#xff0c;南卡是很受欢迎的一个品牌&#xff0c;而且旗下产品非常丰富&…

基于Redis优化验证码登录流程, 解决登录状态刷新问题

文章目录 1 问题: 多台Tomcat间session共享问题2 Redis代替session的业务流程分析2.1 设计key的结构2.2 设计Key的具体细节2.3 整体访问流程 3 基于Redis实现短信登录4 解决状态登录刷新问题4.1 初始方案问题4.2 优化方案4.3 代码 1 问题: 多台Tomcat间session共享问题 书接上…

Linux 内存分配/内存管理 相关接口

Linux 内存分配/内存管理 相关接口 分配栈内存alloca() 分配堆内存直接分配malloc() 分配初始化空间calloc() 分配对齐空间posix_memalign()aligned_alloc()过时&#xff1a;memalign()过时&#xff1a;valloc()过时&#xff1a;pvalloc() 修改块的大小realloc()reallocarray()…

20230506在Ubuntu22.04下使用python3下载合并ts切片

20230506在Ubuntu22.04下使用python3下载合并ts切片 2023/5/6 19:42 本文主要是和WIN7/WIN10下的差异比对&#xff01; 一、 Z:\1575\buquan-ts1574.py import requests from multiprocessing import Pool def mission(url,n): headers {"User-Agent":"M…