【数据结构】什么是树?

🦄个人主页 :修修修也

🎏所属专栏 :数据结构

⚙️操作环境 :Visual Studio 2022


目录

📌树的定义

📌树的相关概念

📌线性结构与树结构的对比

📌树的抽象数据类型

📌树的存储结构

🎏双亲表示法

🎏孩子表示法

🎏孩子兄弟表示法

结语


📌树的定义

树(Tree)是n(n≥0)个结点的有限集.n=0时称为空树.

在任意一颗非空树中:

  1. 有且仅有一个特定的称为根(Root)的结点;

  2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树(SubTree),如下图:
    有关树的定义我们还需强调两点:

  3. n>0时根节点是唯一的,不可能存在多个根节点.

  4. m>0时,子树的个数没有限制,但它们一定是互不相交的 .下图的两个结构就不符合树的定义,因为它们都有相交的子树:


📌树的相关概念

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

📌线性结构与树结构的对比

线性结构

  • 第一个数据元素:无前驱

  • 最后一个数据元素:无后继

  • 中间元素:一个前驱一个后继
    树结构

  • 根节点:无双亲且唯一

  • 叶节点:无孩子,可以存在多个

  • 中间节点:一个双亲多个孩子


📌树的抽象数据类型

这里我们给出了一些树的基本常用操作:

cpp 复制代码
ADT 树(tree)
Data
    树是由一个根结点和若干棵子树构成。树中结点具有相同数据类型及层次关系。
Operation
    InitTree(*T):构造空树T。
    DestroyTree(*T):销毁树T。
    CreateTree(*T,definition):按definition中给出树的定义来构造树。
    ClearTree(*T):若树T存在,则将树T清为空树。
    TreeEmpty(*T):若树T为空树,返回true,否则返回false。
    TreeDepth(*T):返回树T的深度。
    Root(T):返回T的根结点。
    Value(T,cur_e):cur_e是树T中一个结点,返回此结点的值。
    Assign(T,cur_e,value):给树T的结点cur_e赋值为value。
    Parent(T,cur_e):若cur_e是树T中的非根结点,则返回它的双亲,否则返回空。
    LeftChild(T,cur_e):若cur_e是树T的非叶结点,则返回它的最左孩子,否则返回空。
    RightSibling(T,cur_e):若cur_e有右兄弟,则返回它的右兄弟,否则返回空。
    InsertChild(*T,*p,i,c):其中p指向树T的某个结点,i为所指结点p的度加上1,
               非空树c与T不相交,操作结果为插入c为树T中p指结点的第i棵子树。
    DeleteChild(*T,*p,i): 其中p指向树T的某个结点, i为所指结点p的度,操作
                结果为删除T中p所指结点的第i棵子树。
endADT

📌树的存储结构

对于树的存储结构,我们这里介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。

🎏双亲表示法

在链表中,我们设置的结点结构是由一个数据域和一个指针域构成的,如下图:

而到了树结构中,由于树中包含了诸多重要的要素,我们的结点构成就非常的灵活了,以双亲表示法为例,我们在每个结点中,附设一个指示器指示其双亲结点在数组的位置.也就是说,每个节点除了知道自己是谁外,还知道它的双亲在哪里.它的结点结构如下图所示:


🎏孩子表示法

孩子表示法的思路是:

把每个结点放到一个顺序存储结构的数组里,再对每个结点的孩子建立一个单链表体现它们的关系.
具体办法是:

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


🎏孩子兄弟表示法

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

结点示意图:

该方法实现的树如下图所示:


结语

希望这篇树的介绍能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是线性表?

【数据结构】线性表的链式存储结构

【数据结构】什么是栈?

【数据结构】用C语言实现顺序栈(附完整运行代码)

【数据结构】深入浅出理解链表中二级指针的应用

【数据结构】10道经典面试题目带你玩转链表


相关推荐
Tom Boom2 分钟前
1.11.信息系统的分类【DSS】
人工智能·算法·机器学习·职场和发展·分类·数据挖掘·系统架构
张胤尘13 分钟前
算法每日一练 (9)
数据结构·算法
WenGyyyL15 分钟前
使用OpenCV和MediaPipe库——驼背检测(姿态监控)
人工智能·python·opencv·算法·计算机视觉·numpy
AnalogElectronic31 分钟前
整理一下arcGis desktop版本软件, 从入门到精通需要学习的知识点
学习·arcgis
邴越33 分钟前
回文子序列问题解题模板
算法·leetcode·职场和发展
柒十三.35 分钟前
江科大51单片机笔记【12】DS18B20温度传感器(上)
笔记·嵌入式硬件·51单片机
头发尚存的猿小二1 小时前
二叉树(顺序结构:堆)---数据结构
数据结构
Flower#1 小时前
【图论】判断图中有环的两种方法及实现
算法·深度优先·图论
胡桃不是夹子1 小时前
学会了蛇形矩阵
c++·算法·矩阵
派阿喵搞电子2 小时前
轻量级 Transformer 架构&多模态预训练框架
学习