数据结构13————树的基本概念和存储

数据结构13————树的基本概念和存储

一.内容

  1. 树的定义
  2. 树的相关术语
  3. 树的ADT
  4. 树的存储

二.树的定义

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.举例
这里写图片描述

这里写图片描述
孩子兄弟法最大的好处是将树转换为二叉树,关于二叉树可以看我的下一篇博客

六参考资料

<大话数据结构>,<数据结构与算法>

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值