【数据结构】什么是树?

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

📌树的定义

📌树的相关概念

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

📌树的抽象数据类型

📌树的存储结构

🎏双亲表示法

🎏孩子表示法

🎏孩子兄弟表示法

结语


📌树的定义

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

在任意一颗非空树中:

  1. 有且仅有一个特定的称为根(Root)的结点;
  2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T_{1},T_{2},......,T_{m},其中每一个集合本身又是一颗树,并且称为根的子树(SubTree),如下图:

有关树的定义我们还需强调两点:

  1. n>0时根节点是唯一的,不可能存在多个根节点.
  2. 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)棵互不相交的树的集合称为森林.

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

线性结构

  • 第一个数据元素:无前驱
  • 最后一个数据元素:无后继
  • 中间元素:一个前驱一个后继

树结构

  • 根节点:无双亲且唯一
  • 叶节点:无孩子,可以存在多个
  • 中间节点:一个双亲多个孩子

📌树的抽象数据类型

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

ADT 树(tree)
Data树是由一个根结点和若干棵子树构成。树中结点具有相同数据类型及层次关系。
OperationInitTree(*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道经典面试题目带你玩转链表


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用宝塔面板部署前端项目到服务器

目录 文章目录 前言 一、第一步:创建文件夹 二、第二步:部署前端项目 三、第三步:打开防火墙 文章目录 前言第一步:创建文件夹第二步:部署前端项目第三步:打开防火墙总结 前言 在此之前,我…

opencv入门到精通——图像上的算术运算

目录 目标 图像加法 图像融合 按位运算 目标 学习图像的几种算术运算,例如加法,减法,按位运算等。 您将学习以下功能:cv.add,cv.addWeighted等。 图像加法 您可以通过OpenCV函数cv.add()或仅通过numpy操作res …

综述 2022-Briefings in Bioinformatics:多模态AI+生物医学数据(主要集中于多组学数据)

Stahlschmidt, Sren Richard, Benjamin Ulfenborg, and Jane Synnergren. "Multimodal deep learning for biomedical data fusion: a review." Briefings in Bioinformatics 23.2 (2022): bbab569. https://doi.org/10.1093/bib/ bbab569 被引次数:124 …

java八股jvm

JVM虚拟机篇-01-JVM介绍、运行流程_哔哩哔哩_bilibili 1.PC程序计数器 2.堆 3.虚拟机栈 4.方法区/永久代/元空间 5.直接内存 JVM虚拟机篇-06-JVM组成-你听过直接内存吗_哔哩哔哩_bilibili 6.双亲委派 从下往上找,有同名类优先使用上级加载器的,不用自…

JavaWeb笔记之前端开发JQuery

一、引言 1.1 概述 jQuery是一个快速、简洁的JavaScript代码库。jQuery设计的宗旨是“Write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的 JavaScript操作方式&#xff0c…

nginx userid到底做了啥?

我们公司在用nginx的userid模块作为简单的用户请求追踪使用。这个模块其实并不能真正记录用户的请求状态,只能作为一个辅助使用。但是在一些场景下会有一些异常。下面我们简单介绍一下这个模块到底做了什么。 userid 模块简介 官网说明文档 ngx_http_userid_modul…

黑盒测试与白盒测试(超详细整理)

黑盒测试与白盒测试是软件测试中两种不同的测试方法,它们的主要区别在于测试者对被测试软件的了解程度。下面,我们将详细介绍这两种测试方法的特点和适用场景。 一、黑盒测试 黑盒测试又称为功能测试,是针对被测试软件的功能进行测试的一种…

Java_队列(Queue)详解

目录 前言 队列(Queue) 概念 队列的使用 循环队列 循环队列的构思 代码的实现 双端队列(Deque) 概念 方法 双端队列的使用 前言 超详细地讲解了循环队列,为什么要有循环队列 , 普通队列 , 双端队列 队列(Queue) 概念 队列:只允许在一端进行插入数据操…

“做开源犹如养护花朵,花开需要时间”|2023年度总结

你好,我是 Kagol。 2023年已经接近尾声,OpenTiny 从一颗种子🥑逐渐发芽🌱、出苗🌿、长叶🍃,希望明年能长成一棵大树🌲。 回顾 OpenTiny 开源这10个月,我们付出了非常多…

【vue】开发常见问题及解决方案

有一些问题不限于 Vue,还适应于其他类型的 SPA 项目。 1. 页面权限控制和登陆验证页面权限控制 页面权限控制是什么意思呢? 就是一个网站有不同的角色,比如管理员和普通用户,要求不同的角色能访问的页面是不一样的。如果一个页…

MySQL中CASE when 实战

CASE 语法 CASEWHEN condition1 THEN result1WHEN condition2 THEN result2WHEN conditionN THEN resultNELSE result END; 将表中的内容转换为右边的形式: 1、创建表,创建数据 CREATE TABLEchapter10_7 (order_id VARCHAR(255) NULL,price VARCHAR(25…

el-tree lazy懒加载(进阶版)

2023.12.22今天我学习了el-tree如何实现懒加载&#xff0c;效果如&#xff1a; 代码如下&#xff1a; 懒加载的使用不需要用:data <template><div><el-tree:props"props":load"loadNode"lazynode-key"id"show-checkbox/><…