树的基本概念和存储结构

news2025/2/27 21:13:47

一、树的基本概念

1、树的定义


树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:

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

    显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下特点:

    ①没有父节点的节点称为根节点;
    ②每一个非根节点有且只有一个父节点;
    ③每个子树是不相交的;
    ④n个结点的树中有n-1条边。

结合图来看,可能会更好理解

这就是一棵典型的二叉树

这里,2,3共有子节点5,也就是5有两个父亲,那么上图就不是树了。

这里,CF组成的子树与DGH组成的子树相交,那么上图也不是树了。

2、基本术语

1、祖先、子孙,父亲、孩子、兄弟:

      根节点A到结点K的路径上的任意结点,称为结点K的祖先。如结点B是结点K的祖先,而结点K是结点B的子孙。

       路径上最接近结点K的结点E称为K的父亲,而K为结点E的孩子。根节点A是树中唯一没有父亲的结点。

       有相同双亲的结点称为兄弟,如结点K和结点L有相同的双亲E,即K和L为兄弟。


2、节点的度、树的度

      树中一个结点的孩子个数称为该结点的度,

      树中结点的最大度数称为树的度。

      如结点B的度为2,结点D的度为3,树的度为3。


3、分支结点、叶子结点

      度大于0的结点称为分支结点(又称非终端结点,如BCDEH);

      度为0(没有孩子结点)的结点称为叶子结点(又称终端结点,如KLFGMIJ)。

     
4、结点的深度、高度、层次
     结点的层次从树根开始定义,根结点为第1层,它的子结点为第2层,以此类推。

     双亲在同一层的结点互为堂兄弟,图中结点G与E,F,H,I,J互为堂兄弟。

     结点的深度是从根结点开始自顶向下逐层累加的。

     结点的高度是从叶结点开始自底向上逐层累加的。

     树的高度(或深度)是树中结点的最大层数。图中树的高度为4。

5、有序树、无序树

     树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树

     树中任意节点的子节点之间有顺序关系,这种树称为有序树

6、路径、路径长度。

      树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的的个数。
      注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。

7、森林

     森林是m (m≥0)棵互不相交的树的集合。

      森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给m棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林就变成了树。

注意:上述概念无须刻意记忆, 根据实例理解即可。

二、树的存储结构

    1、双亲表示法

实现:定义结构数组,存放树的结点,每个结点有两个域,分别是数据域和指针域(双亲域),数据域用于存放结点本身信息,指针域用于存放本结点的双亲结点在数组中的位置。

双亲表示的结点结构

data(数据域)parent(指针域)
存储结点的数据信息存储该结点的双亲所在数组中的下标

双亲表示法示意图:

双亲表示法结构定义:

//结点结构
struct PTNode
{   int data;           //数据域
    int parent;         //双亲域
}PTNode;
 
//树结构
 struct
{
    PTNode nodes[100];    //结点数组
    int r,n;                  //根结点位置和结点数
}

    双亲表示法的特点

  • 由于根结点是没有双亲的,约定根结点的位置位置域为-1.
  • 根据结点的parent指针很容易找到它的双亲结点。所用时间复杂度为O(1),直到parent为-1时,表示找到了树结点的根。
  • 缺点:如果要找到孩子结点,需要遍历整个结构才行

    2、孩子链表法

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

孩子表示法有两种结点结构:孩子链表的孩子结点表头数组的表头结点

  • 孩子链表的孩子结点的结点结构:
child(数据域)next(指针域)
存储某个结点在表头数组中的下标存储指向某结点的下一个孩子结点的指针

  • 孩子链表的双亲结点的结点结构:
data(数据域)firstchild(头指针域)
存储某个结点的数据信息存储该结点的孩子链表的头指针

孩子链表的结构示意图:

孩子链表表示法的结构定义:

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

//双亲结点
typedef struct
{   ElemType data;
    ChildPtr firstchild;
}CTBox;
 
//树结构
typedef struct
{   CTBox nodes[100];
    int r, n;              //根的位置和结点数
}CTree;

    特点:找孩子容易,找双亲困难。

    对于孩子表示法,查找某个结点的某个孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。但是当要寻找某个结点的双亲时,就不是那么方便了。所以可以将双亲表示法和孩子表示法结合,形成双亲孩子表示法

树的双亲孩子链表的结构示意图:

树的双亲孩子表示法结构定义:

typedef struct CTNode{  // 孩子结点
    int child;  // 孩子结点的下标
    struct CTNode * next;  // 指向下一结点的指针
}*ChildPtr;

typedef struct {  // 表头结构
    int data;  // 存放在数中的结点数据
    int parent;      // 存放双亲的下标
    ChildPtr firstchild;  // 指向第一个孩子的指针
}CTBox;

typedef struct {  // 树结构
    CTBox nodes[100]; // 结点数组
    int r;  // 根的位置
    int n;  // 结点树
}CTree;


3、孩子兄弟表示法

    任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟存在也是唯一的。因此,设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。

孩子兄弟表示法的结点结构:

data(数据域)firstchild(指针域)rightsib(指针域)
存储结点的数据信息存储该结点的第一个孩子的存储地址存储该结点的右兄弟结点的存储地址

孩子兄弟表示法结构示意图:

孩子兄弟结点的结构定义:

/* 树的孩子兄弟表示法结构定义*/
typedef struct CSNode{
    int data;
    struct CSNode * firstchild;
    struct CSNode * rightsib;
    
}CSNode, *CSTree;

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

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

相关文章

AFL模糊测试

一、AFL简介 AFL(American Fuzzy Lop)号称是当前最高级的Fuzzing 测试工具之一 ,是由安全研究员Michał Zalewski(lcamtuf)开发的一款 基于覆盖引导(Coverage-guided)的 模糊测试工具&#xff0…

CentOS系统环境搭建(十九)——CentOS7安装chat GPT

centos系统环境搭建专栏🔗点击跳转 CentOS7安装chat GPT Welcome to the AI era! 基于上一篇文章CentOS系统环境搭建(十八)——CentOS7安装Docker20.10.12和docker compose v2,你已经安装了docker20以上的版本。那么&#xff0…

代码随想录第30天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

860.柠檬水找零 /*** param {number[]} bills* return {boolean}*/ var lemonadeChange function(bills) {let d50let d100let d200for(let i0;i<bills.length;i){if(bills[i]5){d51}else if(bills[i]10){if(d5>1){d5--d10}elsereturn false}else{if(d5>1&&…

圣杯交易系统选股公式,ADX指标和EMA均线配合使用

圣杯交易系统是由琳达布拉德福德拉希克(Linda Bradford Raschke)开发的&#xff0c;她是杰克施瓦格《新金融怪杰》书中的访谈对象。圣杯策略的目标是发现强劲趋势确立后的首次回撤&#xff0c;依据平均趋向指标ADX和指数移动平均线EMA的协同作用来确定趋势强度和合适的交易区域…

Vue中extend基本用法

1.Vue.extend(options) 参数: {Object} options用法&#xff1a; 使用基础Vue构造器&#xff0c;创建一个"子类"。参数是一个包含组件选项的对象。 data选项是特例&#xff0c;需要注意&#xff0c;在Vue.extend()中它必须是函数。 <html><head><tit…

武汉凯迪正大—直读激光盐密灰密测试仪

一、凯迪正大—绝缘子灰密盐密测试仪产品概述 凯迪正大绝缘子灰密盐密测试仪采用的检测技术将灰密测试与盐密测试合二为一&#xff0c;可同时检测出被测绝缘子的灰密度和盐密度&#xff0c;简化了绝缘子污秽检测的流程&#xff0c;适合在巡检现场和实验室使用。 二、凯迪正大…

JDK17:未来已来,你准备好了吗?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行&#xff0c;每行分别先给出多项式非零项的个数&#xff0c;再以指数递降方式输入一个多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 输出格式: 输出分2行…

正中优配:散户怎么实现T+0?散户在股市上怎么变相T+0?

T0是指当天买入的标的物&#xff0c;在当天就能卖出的买卖方式&#xff0c;其中&#xff0c;在a股市场上&#xff0c;散户能够通过一些办法直接地完成T0买卖方式&#xff0c;接下来&#xff0c;正中优配为大家预备了相关内容&#xff0c;以供参阅。 散户在股票市场上&#xff0…

Linear Decryption: Rate-1 FHE TLP

参考文献&#xff1a; [ILL89] Russell Impagliazzo, Leonid A. Levin, and Michael Luby. Pseudo-random generation from oneway functions (extended abstracts). In 21st Annual ACM Symposium on Theory of Computing, pages 12–24, Seattle, WA, USA, May 15–17, 1989.…

苹果macOS13Ventura更新体验:新功能带来的全新体验

macOS 13 Ventura 是一款功能强大、界面美观的操作系统。它为用户提供了更好的使用体验&#xff0c;加强了与其他设备的互联互通&#xff0c;提高了隐私和安全性。无论是日常办公还是娱乐&#xff0c;macOS 13 Ventura 都能满足用户的需求&#xff0c;并带来更多的便利和乐趣。…

Linux之history、tab、alias、命令执行顺序、管道符以及exit

目录 Linux之history、tab、alias、命令执行顺序、管道符以及exit history历史命令 格式 参数 修改默认记录历史命令条数 案例 案例1 --- 显示history历史记录中出现次数最高的top10 案例2 --- 增加history显示的时间信息 命令与文件名补全 --- tab 命令别名 格式 案…

线性代数的学习和整理22:矩阵的点乘(草稿)

4 矩阵乘法 A,B两个同阶同秩N阵&#xff0c;看上去结构一样&#xff0c;但两厢相乘&#xff0c;在做在右&#xff0c;地位差别巨大。 在左&#xff0c;你就是基&#xff0c;是空间的根本&#xff0c;是坐标系&#xff0c;是往哪去、能到哪的定海神针&#xff0c;是如来佛手&a…

编程语言排行榜

以下是2023年的编程语言排行榜&#xff08;按照流行度排序&#xff09;&#xff1a; Python&#xff1a;Python一直以来都是非常受欢迎的编程语言&#xff0c;它简洁、易读且功能强大。在数据科学、机器学习、人工智能等领域有广泛应用。 JavaScript&#xff1a;作为前端开发…

seatunnel win idea 本地调试

调试FakeSource&#xff0c;LocalFile # Set the basic configuration of the task to be performed env {execution.parallelism 1job.mode "BATCH" }# Create a source to connect to Mongodb source {# This is a example source plugin **only for test and d…

穷举深搜暴搜回溯剪枝(4)

一)单词搜索: 直接在矩阵中依次找到特定字符串 79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 画出决策树&#xff0c;只需要做一个深度优先遍历: 1)设计dfs函数:只需要关心每一层在做什么即可&#xff0c;从这个节点开始&#xff0c;开始去尝试匹配字符串的下一个字符…

如何配置视频直播点播平台EasyDSS视频服务平台参数,使同一直播间实现重复推流?

EasyDSS视频直播点播平台集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频等功能&#xff0c;分发的视频流可覆盖全终端、全平台。 EasyDSS已创建的直播间可支持重复推流&#xff0c;但为了保证直…

使用Idea导入mybatis dependence时爆红解决方法

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency>如上在pom.xml中配置mybatis的dependence1时出现爆红的情况。 解决方法 找到idea编辑器右侧的maven按钮…

Linux 中的 chroot 命令及示例

Linux/Unix系统中的chroot命令用于更改根目录。Linux/Unix 类系统中的每个进程/命令都有一个称为root 目录的当前工作目录。它更改当前正在运行的进程及其子进程的根目录。 在此类修改的环境中运行的进程/命令无法访问根目录之外的文件。这种修改后的环境称为“ chroot监狱”或…

maven依赖找不到的解决:手动下载、多镜像导入。

maven中央仓库&#xff0c;远在国外&#xff0c;没下载&#xff0c;因为网络原因迟迟下载不下来&#xff0c;所以我们就需要配置一些国内的镜像仓库&#xff0c;来进行jar包的下载。但是阿里的仓库并没有收录中央仓库的全部jar包&#xff0c;因此导致我们有些jar包下载不下来&a…