【笔记】树(Tree)

一、树的基本概念

1、树的简介

之前我们都是在谈论一对一的线性数据结构,可现实中也有很多一对多的情况需要处理,所以我们就需要一种能实现一对多的数据结构--“树”。

2、树的定义

树(Tree)是一种非线性的数据结构,它是n(n >= 0)个结点组成的一个具有层次关系的有限集。之所以把它叫做树是因为它看起来像一颗倒挂的树,也就是它的根是朝上,而叶子是朝上的。

在n=0时称为空树。在任意一颗非空树中:

  1. 有且仅有一个特定的称为根(Root)的结点;
  2. 当n>1时,其余结点可分为m(m > 0)个互不相交的有限集T1、T2、...... 、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

注意:在树型结构中,子树之间不能有交集,否则就不能是树形结构。 如果相交了,那就是图。

3、树的一些基本术语

就拿这张图来举例子

  1. 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
  2. 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
  3. 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
  4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
  5. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  6. 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
  7. 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
  10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  11. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  13. 森林:由m(m>0)棵互不相交的树的集合称为森林;

二、树的存储结构

提及存储结构,那必然会想到两种常用的存储结构。一个是顺序存储结构,另一个则是链式存储结构。这两个存储结构在我们之前学习其他的数据结构中也学习过。

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域,也要保存结点和结点之间的关系。实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解双亲表示法,孩子表示法以及孩子兄弟表示法。

1、双亲表示法

我们人可能因为种种原因,没有孩子,但无论是谁都不可能是从石头里蹦出来的(孙悟空除外,它显然不算是人),所以人一定就会有父母。树这种结构也不例外,除了根结点外,其余的每个结点不一定有孩子,但一定有且一个双亲。

#define MAX_TREE_SIZE 100

typedef int TElemType;              //树结点的数据类型,目前暂定为整形

typedef struct PTNode
{
    TElemType data;                //结点数据
    int parent;                    //双亲位置
}PTNode;

typedef struct
{
    PTNode nodes[MAX_TREE_SIZE];    //结点数组    
    int r,n;                        //根的位置和结点数
}

这样的存储结构,我们根据结点的 parent指针很容易找到它的双亲结点,所用的时间复杂度为O(1)。但麻烦的是如果想要知道结点的孩纸是谁,不好意思,请遍历整个结构才行。

2、孩子表示法

把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

 

为此,需要设计两种结点结构,一个是孩子链表的孩子结点,如下表所示

其中,child是数据域,用来存储某个结点在表头数组中的下标;next是指针域,用来存储指向某个结点的下一个孩子结点的指针。

另一个是表头数组的表头结点,如下表所示

其中,data是数据域,存储某个结点的数据信息;firstchild是头指针域,存储该结点的孩子链表的头指针。

#define max_TREE_SIZE 100

typedef int TElemType;                //树结点的数据类型,目前暂定为整形

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

typedef strucct                        //表头结构
{
    TElemType data;
    ChildPTr firstchild;
}CTBox;

typedef struct                         //树结构
{
    CTBox nodes[MAX_TREE_SIZE];        //结点数组
    int r,n;                           //结点位置和结点数
}CTree;

 这样的数据结构对于我们要查找某个结点的孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的,对头结点的数组循环即可。

但是如果想知道某个结点的双亲是谁?就需要遍历整棵树。所以就衍生出了将二者合二为一的方法:孩子兄弟表示法。

3、孩子兄弟表示法

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

 这种表示法,给查找某个结点的某个孩子带来了方便,只需要通过firstchild找到此结点的长子,然后通过长子结点的nextbrother找到它的二弟,接着一直下去,直到找到具体的孩子。

三、树在实际中的运用(表示文件系统的目录树结构)


以上就是关于树的基本概念和存储结构的知识点。有关二叉树的内容会在下一个章节中再详细描述。

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

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

相关文章

Hadoop3:HDFS中NameNode和SecondaryNameNode的工作机制(较复杂)

一、HDFS存储数据的机制简介 HDFS存储元数据(meta data)的时候 结果,记录在fsImage文件里 过程,记录在Edits文件里 同时fsImageEdits最终结果,这个最终结果(fsImageEdits)会保存一份在内存中,为了提升性能…

5月30日在线研讨会 | 面向智能网联汽车的产教融合解决方案

随着智能网联汽车技术的快速发展,产业对高素质技术技能人才的需求日益增长。为了促进智能网联汽车行业的健康发展,推动教育链、人才链与产业链、创新链的深度融合,经纬恒润推出产教融合相关方案,旨在通过促进教育链与产业链的深度…

Cookie 和 Session概念及相关API

目录 1.Cookie概念 2.理解会话机制 (Session) 3.相关API 3.1HttpServletRequest 3.2HttpServletResponse 3.3HttpSession 3.4Cookie 4.代码示例: 实现用户登陆 1.Cookie概念 Cookie 是存储在用户本地终端(如计算机、手机等)上的数据片段。 它…

5款AI工具,PS插件的智能升级

在Photoshop插件的世界里,创新和效率是永远的主题。随着AI技术的融入,传统的PS插件正在经历一场革命。本文将介绍五款结合了人工智能技术的PS插件,它们不仅提升了设计工作的效率,还拓展了创意的边界。 StartAI —— 智能设计的未来…

【包公断案】http请求神秘失踪案

案件名称:http请求离奇失踪案 案发地点:公司内部机器 案发时间:早上9点到9点30分 案发背景:两地三中心,双机房只单边出现该问题 案发事件:服务A的某些api请求离奇失踪,超时无响应,微…

【Qt】如何优雅的进行界面布局

文章目录 1 :peach:写在前面:peach:2 :peach:垂直布局:peach:3 :peach:水平布局:peach:4 :peach:网格布局:peach:5 :peach:表单布局:peach: 1 🍑写在前面🍑 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的。也就是每个控件所在…

数字信号处理:matlab解差分方程

1. 验证全响应 %验证全响应零状态响应零输入响应 %y(n)4y(n-1)x(n),其中x(n)δ(n),y(-1)2.clc;%清屏 clear all;%清除所有变量的值 b[1]; a[1,-4]; ys[2]; xs[0];%没有初始值,就是0 xn[1, zeros(1,4)];%输入序列,假设长度是5,则输出长度也是…

WDW-100G 高温拉力试验机 技术方案书

一、整机外观图: 二、项目简介: 微机控制高温拉力试验机是电子技术与机械传动相结合的新型材料试验机,它具有宽广准确的加载速度和测力范围,对载荷、变形、位移的测量和控制有较高的精度和灵敏度,还可以进行等速加载、…

sharded jedis pipelined 执行后 数据并未存入redis

前言 因为历史原因,在某个同步菜单操作的方法中先清除缓存,然后在初始化缓存。本来很正常的逻辑,但是这个清除是db查询获取所有的菜单 然后循环一条条删除 然后在db查询有效的菜单操作 在循环一条条插进去 经统计这个菜单操作大概有个7千个 …

【区块链】fisco网络运维之添加节点黑名单

基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的黑名单工作,具体操作如下 以node3为例子 1查看node0节点的连接状态日志(现有4个节点连接) 注意:如果查询不到连接状态,修改node0的配置文件中…

QT5.15.2及以上版本安装

更新时间:2024-05-20 安装qt5.15以上版本 系统:ubuntu20.04.06 本文安装:linux-5.15.2 下载安装 # 安装编译套件g sudo apt-get install build-essential #安装OpenGL sudo apt-get install libgl1-mesa-dev# 下载qt安装器 https://downl…

每天五分钟深度学习框架PyTorch:创建具有特殊值的tensor张量

本文重点 tensor张量是一个多维数组,本节课程我们将学习一些pytorch中已经封装好的方法,使用这些方法我们可以快速创建出具有特殊意义的tensor张量。 创建一个值为空的张量 import torch import numpy as np a=torch.empty(1) print(a) print(a.dim()) print(s.shape) 如图…

supOS NEO科技普惠!永久免费!亿元补贴

数字化转型正在全球蓬勃发展,工业操作系统进入大规模推广期! 如果您正在被预算不足、技术团队不强、数字化投入产出比等问题困扰,supOS NEO是您最好的选择。 “让supOS走进万千工厂、千行百业!让全世界每个工厂都能用得上supOS&am…

.net core web项目部署IIS报错:HTTP 错误 413.1 - Request Entity Too Large

HTTP 错误 413.1 - Request Entity Too Large 解决办法 这个报错的原因是因为IIS配置问题,IIS最大默认配置只有30M,超过30M就会报错 解决办法 在程序中配置能接收最大字节大小 //配置请求头中能最大接收多少数据 //builder.WebHost.UseKestrel(option…

VS2022通过C++网络库Boost.asio搭建一个简单TCP异步服务器和客户端

基本介绍 上一篇博客我们介绍了通过Boost.asio搭建一个TCP同步服务器和客户端,这次我们再通过asio搭建一个异步通信的服务器和客户端系统,由于这是一个简单异步服务器,所以我们的异步特指异步服务器而不是异步客户端,同步服务器在…

c语言:利用随机函数产生20个[120, 834] 之间互不相等的随机数, 并利用选择排序法将其从小到大排序后输出(每行输出5个)

利用随机函数产生20个[120, 834] 之间互不相等的随机数&#xff0c; 并利用选择排序法将其从小到大排序后输出&#xff08;每行输出5个&#xff09; 代码如下&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> int shenchen(int a[…

全栈实现发送验证码注册账号 全栈开发之路——全栈篇(3)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

分布式音乐播放器适配了Stage模型

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;应用开发自API 8及其更早版本一直使用的是FA模型进行开发。FA模型是Feature Ability的缩写&#xff0c;它和PA&#xff08;Particle Ability&#xff09;两种类型是过往长期推广的术语&#xff0c;深入人心…

6.2 else if语句

本节必须掌握的知识点&#xff1a; 示例代码二十 代码分析 汇编解析 ■if语句表达形式3 if(表达式1) statement1 else if(表达式2) statement2 else if(表达式3) statement3 …… else statementN 解析&#xff1a; 如果表达式1非0&#xff0c;则执行statement1&#…

Java基础22(JSON解析 注解)

目录 一、JSON解析 1. JSON语法 2. JSON的用途 3. Java解析JSON 4. 使用Fastjson 4.1 Fastjson 的优点 4.2 Fastjson 导包 4.3 Fastjson的主要对象 4.4 常用方法 将Java对象 "序列化"&#xff08;转换&#xff09; 为JSON字符串&#xff1a; 将JSON字符串…