【数据结构】什么是树?

举报
修修修也 发表于 2024/09/30 16:40:10 2024/09/30
【摘要】 ​ 🦄个人主页:修修修也 🎏所属专栏:数据 结 构 ⚙️操作环境:Visual Studio 2022​编辑目录📌 树 的定 义 📌 树 的相关概念 📌 线 性 结 构与 树结 构的 对 比 📌 树 的抽象数据 类 型 📌 树 的存 储结 构 🎏 双 亲 表示法 🎏 孩子表示法 🎏 孩子兄弟表示法 结语 📌树的定义树(Tree)是n(n≥0)个结点的有限集.n=0时称为...

 

🦄个人主:修修修也

🎏所属专栏:数据

⚙️操作:Visual Studio 2022

​编辑


📌 的定

📌 的相关概念

📌 线 构与 树结 构的

📌 的抽象数据

📌 的存 储结

🎏 表示法

🎏 孩子表示法

🎏 孩子兄弟表示法

结语


📌的定

(Tree)是n(n≥0)个点的有限集.n=0.

在任意一非空:

1. 有且有一个特定的称(Root)的;

2. 当n>1,其余点可分m(m>0)个互不相交的有限集,其中每一个集合本身又是一颗树,并且称根的子(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

树是由一个根结点和若干棵子树构成。树中结点具有相同数据类型及层次关系。

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道 典面 试题 你玩 转链


​编辑

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。