数据结构(十八)树的定义与存储结构
一、树的定义
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
数据结构(十八)树的定义与存储结构相关推荐
- 数据结构c语言——树的三种存储结构(双亲表示法、孩子表示法、兄弟表示法)
在大量的应用中,人们曾使用多种形式的存储结构来表示树.这里,我们介绍3种常用的链表结构. 1.双亲表示法: 假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置, ...
- Python 数据结构 之 线性表 的链式存储结构
用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明: Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...
- 6.1树的定义和存储
树(Tree)是n(n>=0)个结点的有限集.如下图中,A为根,图6.1(a)称为子树(SubTree) 结点度(Degree):如A的结点度为3,B的结点度为2,C的结点度为1. 结点度为0的 ...
- C语言——数据结构之广义表(概念及其存储结构)
前言 本节我们来说说C语言中的广义表.主要介绍广义表的概念定义,并说明其存储结构,算法中将使用到递归思想. 广义表是线性表的一种推广,在数据结构中有广泛应用. 一.广义表的概念 1.广义表的概念 (1 ...
- 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)
文章目录 一. 树的概念 二. 树的存储结构 (一). 双亲表示法 (二). 孩子表示法 1. 定长结点链表存储结构 2. 孩子链表存储结构 (三). 孩子兄弟表示法 一. 树的概念 树(Tree)是 ...
- 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表)
目录 一.链表(链式存储结构)的特点 二.单链表的定义和表示 1.带头结点的单链表 2.单链表的存储结构 三.单链表基本操作的实现 1.单链表的初始化(带头结点的单链表) 2.补充单链表的几个常用简单 ...
- 【数据结构】4中基本逻辑结构和存储结构
四种基本逻辑结构及其图示. (1) 集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无其他版任何关系. (2) 线性结构:结权构中的数据元素之间存在着一对一的线性关系. (3) 树状结构:结 ...
- 数据结构与算法——栈的链式存储结构及实现
目录 前言 一.栈的链式储存结构 二.栈的链式储存结构的操作 2.1 进栈操作 2.2 出栈操作 总结 前言 讲完了栈的顺序储存结构,我们现在来看看栈的链式存储结构,简称为链栈. 由于单链表中 ...
- 数据结构(十二) -- 树(四) -- 霍夫曼树
1. 基本介绍 给定n个权值为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为了霍夫曼树. 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较 ...
最新文章
- $.messager.confirm (使用$.messager.defaults修改按钮显示文字)
- python游戏编程入门-python游戏编程入门
- win7中VS2010中安装CSS3.0问题解决方法
- jquery字符串转数组
- Android安卓程序消息提示和按钮响应事件
- Android GraphicBuffer
- C学习杂记(四)sizeof计算联合体大小
- java流读取字符串_javaIO之字符流是怎么读取的?
- 画流程图activiti流程图_干货!小白也能一天画100张高逼格流程图
- 99行不用指针 c语言贪食蛇,关于C语言指针的问题
- CANOpen网络管理报文
- seafile安装教程 Linux,CentOS7安装seafile开源版
- 面向对象的tab选项卡实现
- CloudStack(二)基础网络模式安装部署
- linux实现多台服务器文件同步
- 分析LOIC流,判断DDoS攻击源
- 树莓派(0) : 树莓派4系统烧录、开机配置、网络连接、静态ip、开启root账号及ssh
- 模2除法与二进制除法
- 海思3516ev300+ imx335 原理图,其他PCB、软件资料齐全
- 图文并茂带你了解成分句法分析