数据结构13————树的基本概念和存储
文章目录
一.内容
- 树的定义
- 树的相关术语
- 树的ADT
- 树的存储
二.树的定义
1.形式化定义:
树(tree)是包含n(n>0)个结点的有穷集,其中:
(1)每个元素称为结点(node);
(2)有一个特定的结点被称为根结点或树根(root)。
(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。
2.需要注意的一些问题
a. n>0时,根节点唯一,不可能存在多个根节点
b. m>0时,子树的个数没有限制,但是它们一定不能相交
3.举例
- 如图所示,是T是一个典型的树,节点A是树的根节点
- 其余元素集合(BCDEF)被分为两个集合,T1(BDEF)和T2(CG),T1和T2本身也是一棵树,也满足树的定义
- 如图所示,此时m分出两个子树相交,所以这一个图不是树。
三.树的相关术语
1.节点相关
- 节点的度:节点拥有子树的个数
- 叶子节点/终端节点: 度为0的节点。(子树个数为0)
- 分支节点/非终端节点:度不为0的节点。
- 树的度:树内个节点的度的最大值
在树T中: A根节点,ABC为分支节点,DEFG为叶子节点,树T中节点D度最大为3,所以树T的度为3
2.节点间关系
- 节点的孩子与双亲:节点子树的根称为该节点的孩子,相应的该节点称为孩子的双亲
- 节点的兄弟: 同一双亲的孩子互称为兄弟
- 节点的祖先: 从根的到该节点的所经分支的所以节点
- 节点的子孙:所以该节点为根的子树的所有节点,都是该节点子孙
在树T中 ;B是DEF的双亲节点,DEF是B的孩子节点,DEF互为兄弟节点,BA是D的祖先,BCDEFG都是A的子孙
3.其他相关概念
- 节点的层次:从根节点开始定义,根节点为第一层,根的孩子为第二层,根的孩子的孩子为第三层,以此类推
- 节点的堂兄弟: 双亲在同一层次的节点互称为堂兄弟
- 树的深度:节点的最大层次
- 无序树和有序树:子树从左到右有大小关系不可以互换,称为有序树,反之称为无序树
- 森林:m(m>=0)不相交树的集合
在树T中: A是第一层,BC是第二层,DEFG是第三层,FG互为堂兄弟,树的深度为3
四.树的ADT
ADT 树(tree)
Data
树是由一个根节点和若干子树构成.树的节点拥有相同的数据类型及层次结构
Operation
①InitTree(Tree);
②DestoryTree(Tree);
③CreatTree(Tree);
④TreeEmpty(Tree);
⑤Root(Tree);
⑥Parent(Tree,x);
⑦FirstChild(Tree,x);
⑧NextSibling(Tree,x);
⑨InsertChild(Tree,p,Child);
⑩DeleteChild(Tree,p,Child);
endADT
五.树的存储
主要介绍: 双亲表示法,孩子表示法,孩子兄弟表示法
1.双亲表示法
a.存储形式
使用连续存储空间(数组),将每个节点存储进去,并且对于每个节点,将他们的双亲节点的信息存储进去。
b.举例
-1表示不存在
c.扩充
对于上面的结构而言,还可以添加更多的附加信息,比如说添加第一个孩子的信息,或者添加有兄弟的信息
2.孩子表示法
存储形式
将一个节点和它所有孩子的节点使用指针链接起来
举例
方案a:
树的度为树节点的最大值,所以设置节点指针域的个数为树的度
方案b
方案a中并不是每个节点都达到了树的度,造成了很大浪费,对方案a进行改进,增加一个表示孩子个数的变量
方案C:
方案b依然有些不足,由于每个节点的链表是不同的结构,加之要维护表示节点的度的数组,也增加时间的消耗。我们使用数组链表结合的方法来表示他的孩子
3.孩子兄弟法
a.存储形式
对于任意一个节点,第一个节点存储它的第一个孩子,第二个节点存它的右兄弟
b.举例
孩子兄弟法最大的好处是将树转换为二叉树,关于二叉树可以看我的下一篇博客
六参考资料
<大话数据结构>,<数据结构与算法>