一、树的定义

  1.树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、...Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

  2.结点分类:树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

  3.结点间关系:结点的子树的根称为该结点的孩子(Child),该结点称为孩子的双亲(Parent)。同一个双亲的孩子之间互称为兄弟(Sibling),结点的祖先是从根到该结点所经分支上的所有结点,反之,以某结点为根的子树中任一结点都称为该结点的子孙。

  4.结点的层次(Level):从根开始定义起,根为第一层,根的孩子为第二层次。若某结点在第i层,则其子树的根就在第i+1层。其双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度。

  5.如果将树中结点的各子树看成从左到右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。森林(Forest)是m(m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。

  二、树的存储结构

  树的存储结构有四种不同的表示法:双亲表示法、孩子表示法、双亲孩子表示法、孩子兄弟表示法。

  1.双亲表示法

  以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在数组中的位置。结点结构包括data数据域和parent指针域。约定根结点的位置与设置为-1。这种存储结构,可以根据结点的parent指针很容易找到它的双亲结点,所用的时间复杂度为O(1),直到parent为-1时,表示找到了树结点的根。但是,要知道结点的孩子是什么,只能遍历整个结构才行。

  为了便于找到结点的孩子是什么,可以增加一个结点最左边孩子的域firstchild,叫它长子域,这样就很容易得到结点的孩子。如果没有孩子的结点,这个长子域就设置为-1。对于有2个孩子来说,知道了长子,另一个当然就是次子了。

  为了便于体现各兄弟之间的关系,可以增加一个右兄弟域rightsib来记录每个结点右兄弟的下标,如果右兄弟不存在,就设置为-1。

  2.孩子表示法

  由于树中每个结点可能有多棵子树,可以考虑用多重链表,即每个结点有多个指针域,其中每个指针指向一棵子树的根结点,把这种方法叫做多重链表表示法。由于树的每个结点的读,也就是它的孩子个数是不同的,所以有两种方案来解决。

  方案一:指针域的个数就等于树的度,也就是各个结点度的最大值。适用于树的各结点度相差很小的情况下,因为开辟的空间都被充分利用了。

  方案二:每个结点指针域的个数等于该结点的度,专门取一个位置来存储结点指针域的个数。这种方法克服了浪费空间的缺点,对空间利用了是很高了,但是由于各个结点的链表是不相同的结构,加上要维护结点的度的数值,在运算上就会带来时间上的损耗。

  孩子表示法既可以减少空指针的浪费又能使结点结构相同。具体办法是,把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则次单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。表头数组的表结构包括data数据域和firstchild孩子链表头指针域。孩子链表的孩子结点的结构包括child数据域,用来存储某个结点在表头数组中的下标,还有next指针域,用来存储指向某结点的下一个孩子结点的指针。

  3.双亲孩子表示法

  对于孩子表示法来说,这样的结构对于查找某个结点的某个孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的,对头结点的数组循环即可。但是,要想知道某个结点的双亲是谁,就必须要遍历整棵树才行。可以把双亲表示法和孩子表示法综合一下形成双亲孩子表示法,即在头结点增加一个parent指针域即可。

  4.孩子兄弟表示法

  任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,可以将结点结构设计成这样:data数据域,firstchild指针域用来存储该结点的第一个孩子结点的存储地址,rightsib指针域用来存储该结点的右兄弟结点的存储地址。

  孩子兄弟表示法,给查找某个结点的某个孩子带来了方便,只需要通过firstchild找到次结点的长子,再通过长子结点的right找到它的二弟,接着一直下去,直到找到具体的孩子。

转载于:https://www.cnblogs.com/BigJunOba/p/9208126.html

数据结构(十八)树的定义与存储结构相关推荐

  1. 数据结构c语言——树的三种存储结构(双亲表示法、孩子表示法、兄弟表示法)

    在大量的应用中,人们曾使用多种形式的存储结构来表示树.这里,我们介绍3种常用的链表结构. 1.双亲表示法: 假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置, ...

  2. Python 数据结构 之 线性表 的链式存储结构

    用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明:  Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...

  3. 6.1树的定义和存储

    树(Tree)是n(n>=0)个结点的有限集.如下图中,A为根,图6.1(a)称为子树(SubTree) 结点度(Degree):如A的结点度为3,B的结点度为2,C的结点度为1. 结点度为0的 ...

  4. C语言——数据结构之广义表(概念及其存储结构)

    前言 本节我们来说说C语言中的广义表.主要介绍广义表的概念定义,并说明其存储结构,算法中将使用到递归思想. 广义表是线性表的一种推广,在数据结构中有广泛应用. 一.广义表的概念 1.广义表的概念 (1 ...

  5. 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)

    文章目录 一. 树的概念 二. 树的存储结构 (一). 双亲表示法 (二). 孩子表示法 1. 定长结点链表存储结构 2. 孩子链表存储结构 (三). 孩子兄弟表示法 一. 树的概念 树(Tree)是 ...

  6. 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表)

    目录 一.链表(链式存储结构)的特点 二.单链表的定义和表示 1.带头结点的单链表 2.单链表的存储结构 三.单链表基本操作的实现 1.单链表的初始化(带头结点的单链表) 2.补充单链表的几个常用简单 ...

  7. 【数据结构】4中基本逻辑结构和存储结构

    四种基本逻辑结构及其图示. (1) 集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无其他版任何关系. (2) 线性结构:结权构中的数据元素之间存在着一对一的线性关系. (3) 树状结构:结 ...

  8. 数据结构与算法——栈的链式存储结构及实现

    目录 前言 一.栈的链式储存结构 二.栈的链式储存结构的操作 2.1   进栈操作 2.2   出栈操作 总结 前言 讲完了栈的顺序储存结构,我们现在来看看栈的链式存储结构,简称为链栈. 由于单链表中 ...

  9. 数据结构(十二) -- 树(四) -- 霍夫曼树

    1. 基本介绍 给定n个权值为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为了霍夫曼树. 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较 ...

最新文章

  1. $.messager.confirm (使用$.messager.defaults修改按钮显示文字)
  2. python游戏编程入门-python游戏编程入门
  3. win7中VS2010中安装CSS3.0问题解决方法
  4. jquery字符串转数组
  5. Android安卓程序消息提示和按钮响应事件
  6. Android GraphicBuffer
  7. C学习杂记(四)sizeof计算联合体大小
  8. java流读取字符串_javaIO之字符流是怎么读取的?
  9. 画流程图activiti流程图_干货!小白也能一天画100张高逼格流程图
  10. 99行不用指针 c语言贪食蛇,关于C语言指针的问题
  11. CANOpen网络管理报文
  12. seafile安装教程 Linux,CentOS7安装seafile开源版
  13. 面向对象的tab选项卡实现
  14. CloudStack(二)基础网络模式安装部署
  15. linux实现多台服务器文件同步
  16. 分析LOIC流,判断DDoS攻击源
  17. 树莓派(0) : 树莓派4系统烧录、开机配置、网络连接、静态ip、开启root账号及ssh
  18. 模2除法与二进制除法
  19. 海思3516ev300+ imx335 原理图,其他PCB、软件资料齐全
  20. 图文并茂带你了解成分句法分析

热门文章

  1. 阿里中间件再获高度肯定,“三位一体”推动技术普惠
  2. 史上最轻量​!阿里新型单元测试Mock工具开源了
  3. 深耕边缘计算 揭秘阿里云边缘云网一体化的技术实践
  4. 航空企业如何用「AI利器」提升乘客体验
  5. 人工智能改变生活的 10 种方式
  6. 绝望的力量:美术创作者的晋级之路
  7. 【三国志战略版】拆解与分析
  8. 游戏开发者需要注意的4个内存使用问题
  9. 【JavaScript脚本】——T1基本语法——重点笔记
  10. 数据库面试题【十二、存储引擎选择】