【数据结构】非线性表----树详解

是一种非线性结构,它是由**n(n>=0)**个有限结点组成一个具有层次关系的集合。具有层次关系则说明它的结构不再是线性表那样一对一,而是一对多的关系;随着层数的增加,每一层的元素个数也在不断变化(由上一层和该层的对应关系决定)。

关于树的名称的由来,是因为它的结构类型很像现实中的树倒过来,故称作——树。
在这里插入图片描述

根据树的名称,也对其所包含的元素进行了命名和定义。

树的基本术语

1.结点:包含一个数据元素及若干指向其子树的分支;

2.结点的度:一个结点拥有的子树的数目;

3.叶子或终端结点:度为0的结点;

4.非终端结点或分支结点:度不为0的结点;

5.树的度:树内各结点的度的最大值;(需要注意,树的度和结点的度的定义是有略微差异的)

除此之外,还使用人类亲缘关系进行了一系列描述:(注:下图的关系与节点名称无关,仅代表树的结构)
在这里插入图片描述

6.孩子结点或子结点:结点的子树的根称为该结点的孩子结点或子结点;

7.双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的双亲结点或父结点;

8.兄弟结点:同一个双亲的孩子之间互称兄弟;

9.祖先结点:从根到该结点所经分支上的所有结点;

10.子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙;

11.结点的层次:从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第L层.则其子树的根就在第L+1层;

12.堂兄弟结点:其双亲在同一层的结点互为堂兄弟;

13.树的深度或高度:树中结点的最大层次;

14.森林:由m(m>=0)棵互不相交的树的集合称为森林;

15.有序树和无序树:树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则称为无序树;

16.路径和路径长度:路径是由树中的两个结点之间的结点序列构成的。而路径长度是路径上所经过的边的个数

树的基本特征

针对树,我们有很多可以说的点。这里我们主要从其结构特征来进行总结。

  • 任何一棵树都是由根和子树构成的——子树又是一棵树——树是递归定义的

  • 树的根结点没有前驱;除根结点外的所有结点有且只有一个前驱(也就是一个父节点)

  • 树中所有结点有零个或多个后继

  • 子树是不相交的。

  • 当不再有子树的时候就说明该树已经到了尾结点。

树的公式

事实上,基于树的数据结构,可以衍生出很多数学公式来对其进行计算,但是这里只介绍基本的两个(其他重要的公式会在二叉树中进行介绍)

节点数量
  • 对于一棵有 n 个节点的树,节点数量公式为:n = I + L 其中,I 是内节点数量,L 是叶节点数量。
边数
  • 一棵有 n 个节点的树有 n−1 条边。

树的构建

树的存储结构主要有以下几种方法,每种方法都有其优缺点和适用场景:

1. 父节点表示法(Parent Representation)

每个节点记录其父节点的编号或指针。这种方法使用一个数组,其中每个元素表示节点,其值是该节点的父节点的索引。

  • 结构

    parent[i] 表示第 i 个节点的父节点
    
  • 示例

    节点:  0  1  2  3  4  5
    父节点: -1  0  0  1  1  2  (-1 表示根节点)
    
  • 优点:简单,适合快速查找父节点。

  • 缺点:查找子节点较慢,需要遍历整个数组。

2. 孩子表示法(Child Representation)

每个节点记录其所有子节点。这种方法使用一个链表或数组,其中每个节点包含一个指向其子节点列表的指针。

  • 结构

    children[i] 表示第 i 个节点的子节点列表
    
  • 示例

    节点:   0  1  2  3  4  5
    子节点: [1,2] [3,4] [5] [] [] []
    
  • 优点:适合快速查找子节点。

  • 缺点:查找父节点较慢,需要记录父节点指针或进行额外处理。

以上两种方法的缺点和优点是互补的。那么是否有更为方便的方法呢?

3. 孩子兄弟表示法(Left-Child Right-Sibling Representation)

当我们需要定义很多孩子的时候,我们可以使用左孩子右兄弟的定义法

也就是说根节点只指向它的第一个孩子结点,而其他的孩子节点就交给第一个孩子节点去指向

将树转换为二叉树,每个节点记录其最左子节点和右兄弟节点。这种方法使用两个指针,一个指向最左子节点,另一个指向右兄弟。

  • 结构

    节点: node
    左孩子: leftChild
    右兄弟: rightSibling
    
  • 示例

    节点:    0/ \1   2/ \3   4
    转换为:
    节点:    0/  \1    2/3\4
    
  • 优点:能将任意树转换为二叉树,利用二叉树的遍历和处理方法。

  • 缺点:需要两个指针,内存开销较大。

4. 邻接表表示法(Adjacency List Representation)

通常用于存储图结构,但也可以用于树。每个节点记录其相邻节点(即子节点和父节点)。

  • 结构

    adjList[i] 表示第 i 个节点的相邻节点列表
    
  • 示例

    节点:   0  1  2  3  4  5
    相邻节点: [1,2] [0,3,4] [0,5] [1] [1] [2]
    
  • 优点:适合处理树和图的遍历和搜索。

  • 缺点:需要额外处理以区分子节点和父节点。

5. 邻接矩阵表示法(Adjacency Matrix Representation)

使用一个二维数组表示节点之间的连接关系。通常用于稠密图,但在某些情况下也可用于树。

  • 结构

    adjMatrix[i][j] 表示节点 i 和节点 j 之间是否有边(0 或 1)
    
  • 示例

    节点:  0  1  2  3  4  5
    邻接矩阵:
    [0, 1, 1, 0, 0, 0]
    [1, 0, 0, 1, 1, 0]
    [1, 0, 0, 0, 0, 1]
    [0, 1, 0, 0, 0, 0]
    [0, 1, 0, 0, 0, 0]
    [0, 0, 1, 0, 0, 0]
    
  • 优点:简单,适合快速查找任意两个节点之间是否有边。

  • 缺点:存储空间开销大,不适合稀疏树。

这些存储结构各有特点,选择哪种方法主要取决于具体应用需求,例如查找子节点还是父节点更频繁,内存开销是否是主要考虑因素等。

树的初始化和一些基本操作

#include <stdio.h>
#include <stdlib.h>// 定义树节点结构
typedef struct TreeNode {int data;struct TreeNode* child1;struct TreeNode* child2;struct TreeNode* child3;struct TreeNode* child4;...
} TreeNode;//树的初始化
TreeNode* createNode(int data)
{TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if(!newNode){printf("failed!\n");return NULL;}newNode->data = data;newNode->child1 = NULL;newNode->child2 = NULL;...return newNode;
}//插入、查找、遍历...
TreeNode* insertTree(TreeNode* parent,int data);
TreeNode* findTree(TreeNode* parent,int data);
TreeNode* inorderTraversal(TreeNode* parent);
...

总结

单纯的树实际上用处不大(子节点过多)。但是对于文件系统、目录以及某些分层过多的系统,使用的就是树。

通常在优化的数据结构中,使用更多的是叫做二叉树的数据结构

这是基于树的数据结构,一个根节点只有两个孩子结点,在下一节我们将会对二叉树进行剖析,敬请期待。
在这里插入图片描述

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

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

相关文章

Uniapp 组件 props 属性为 undefined

问题 props 里的属性值都是 undefined 代码 可能的原因 组件的名字要这样写&#xff0c;这个官方文档有说明

docker emqx 配置密码和禁用匿名连接

mqtt版本emqx/emqx:4.4.3 1.首先把镜像内目录/opt/emqx/etc拷贝到本地 2.做映射 3.allow_anonymous&#xff0c; false改成true 4. 5.MQTTX连不上的话看看下图的有没有打开

最优控制问题中的折扣因子

本文探讨了在线性二次型调节器&#xff08;LQR&#xff09;中引入折扣因子的重要性和方法。通过引入折扣因子&#xff0c;性能指标在无穷时间上的积分得以收敛&#xff0c;同时反映了现实问题中未来成本重要性递减的现象&#xff08;强化学习重要概念&#xff09;。详细推导了带…

《0基础》学习Python——第十六讲 __文件读写

<文件读写> 一、什么是文件读写 文件读写是指在Python程序中对文件进行读取和写入操作。通过文件读写&#xff0c;可以读取文件中的数据&#xff0c;或者向文件中写入数据。 Python提供了多种文件读写的方式&#xff0c;其中最常用的方式是使用open()函数打开一个文件&a…

uniapp打包h5,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND

在manifest.json内找到web配置修改运行的基础路径

9 Docker实践_安装JDK

欢迎来到一夜看尽长安花 博客&#xff0c;您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论的问题可联系我&#xff1a;3329759426qq.com 。发布文章的风格因专栏而异&#xff0c;均自成体系&#xff0c;不足…

5G以太网和5G前传业务的有效解决方案——25G可调DWDM光模块

信息技术的迅猛发展和数据传输需求的不断增加&#xff0c;光通信技术在现代网络中扮演着至关重要的角色。DWDM技术通过在一根光纤上使用多个不同波长的光信号同时传输&#xff0c;大幅提高了数据传输的容量。而可调光模块则能够在多种波长之间进行切换&#xff0c;实现灵活、高…

昇思25天学习打卡营第14天|munger85

基于MindNLPMusicGen生成自己的个性化音乐 这个所谓的个性化的音乐就是指你输入一段文字它会根据这个文字输出一段音乐这个音乐是贴近于那段文字的所以叫做文生成音乐&#xff0c; 如果网络正常的话就可以直接从下载这个模型。 那么音乐生成的有两种方式呢有两种方式&#xff…

计算机网络基础:局域网、广域网及OSI七层模型解析

文章目录 一、局域网和广域网1、局域网&#xff08;LAN - Local Area Network&#xff09;2、广域网&#xff08;WAN - Wide Area Network&#xff09;3、对比局域网和广域网 二、OSI七层模型1、OSI的七层网络结构2、OSI的数据传输方式3、网络与操作系统的关系 一、局域网和广域…

基于自编码器和孪生框架的乳腺组织病理图像分类方法

乳腺癌组织病理图像的自动分类是计算机辅助诊断系统的重要任务之一。由于乳腺癌组织病理图像具有类间差异小、类内差异大的特点&#xff0c;提取用于乳腺癌分类的特征比较困难。为了解决这一问题&#xff0c;设计了一种改进的自编码器(AE)网络&#xff0c;该网络使用Siamese框架…

【BUG】已解决:TypeError: object of type ‘int‘ has no len()

已解决&#xff1a;TypeError: object of type ‘int‘ has no len() 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…

【windows|015】UDP协议详解

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

学懂C语言(四):C语言数据类型

目录 一、数据类型分类 二、存储大小和值范围 三、类型转换 在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 一、数据类型分类 C 中的类型可分为以下几…

内六角螺丝外观检测有多严格?

沉头内六角螺丝是一种常见的螺丝类型&#xff0c;具有内部六角孔和沉头设计。这种螺丝通常需要使用内六角扳手或扳手来拧紧或松开。沉头设计让螺丝头部潜入被连接的物体表面&#xff0c;使其表面平整&#xff0c;不会凸起。 沉头设计使螺丝头部潜入物体表面&#xff0c;实现隐…

PAT甲级真题1042判断二叉搜索树

镜像后的树 样例是前序遍历,中序序列就是把前序序列sort一下,然后根据中序序列和前序序列构造一棵树,和树的遍历一样 前序序列:8 6 5 7 10 8 11 中序序列:5 6 7 8 8 10 11 镜像后的中序序列:11 10 8 8 7 6 5 ###在中序序列中有多个相同的根结点,取第一个 ###如果在中序序列中…

解决element-ui e-table表格中使用多选,当翻页时已选中的数据丢失

用element-ui中的table时&#xff0c;当有多选又有翻页功能时&#xff0c;点击翻页后之前选中的数据会丢失&#xff0c;怎么使表格具有记忆功能呢 element-ui API中有几个属性可以供我们完美解决这个问题 1.单元格的属性和方法&#xff1a; 2.表格的方法&#xff1a; <el-…

数据预处理在建模中的重要性与常见方法(二):数据变化篇

1. 数据标准化 数据标准化是将数据转换到同一量纲&#xff0c;以消除不同量纲之间的影响&#xff0c;使数据具有可比性。常见的标准化方法包括Min-Max标准化和Z-score标准化。 &#xff08;1&#xff09;Min-Max标准化 应用场景&#xff1a;适用于对特征范围有要求的模型&…

AI发展除了带来失业,还带来了不少副业兼职,一键无脑生成,月入1W+

前言 今天&#xff0c;我想和大家分享一下在当前经济下行、就业压力加大的背景下&#xff0c;个人如何利用AI技术开展副业&#xff0c;实现月入过万。 近年来&#xff0c;AI技术的发展虽然带来了不少就业岗位的流失&#xff0c;但同时也为我们提供了许多新的副业机会。今天我…

LNMP环境配置问题整理

首先是一键安装直接报错: 换教程:搭建LNMP,步骤最详细,附源码,学不会打我-CSDN博客 mysql安装成功之后: MySQL 启动报错:Job for mysqld.service failed because the control process exited with error code. 如果所有方法都试过之后卸载后重装可以快速解决: 参考…

matlab PID tuner整定工具箱的用法

从主页的APP中搜索到它&#xff1a; 按照下图IMPORT导入被控对象的传递函数 在下图的Inspect按钮中可以看到导入的被控对象的传函。 在下图的Type中选择控制器类型&#xff1a; 在下图的Form中选择PID的形式&#xff1a;有两种可选&#xff1a;平行式Parallel和标准式Standard …