大话数据结构(十三)——树的理论知识

1、树的定义

树(Tree)是n(n>=0)个结点的有限集。

n=0时称为空树。

在任意一棵非空树中:

(1)有且仅有一个特定的称为根(root)的结点。

(2)当n>1时,其余结点可以分为m(m>0)个互不相交的有限集T1,T2,T3……Tm,其中每个集合本身又是一棵树,并且称为根的子树(SubTree)。

1.1 结点分类

树的结点包含一个数据元素及若干指向其子树的分支。

(1)结点拥有的子树数称为结点的度(Degree)。

(2)度为0的结点称为叶结点(leaf)或者终端结点;度不为0的结点称为非终端结点或分支结点。

(3)除了根结点之外,分支结点也称为内部结点。

(4)树的度是树内各结点的度的最大值。

1.2 结点间的关系

结点的子树的根称为该结点的孩子(child)。同样地,该结点称为 孩子的双亲(Parent)。同一个双亲的孩子之间互称兄弟(Sibling)。

结点的祖先是从根到该结点所经分支上的所有结点。反之,以某结点为根的子树中的任一结点都称为该结点的子孙。

1.3 树的其他相关概念

结点的层次(level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第i层,则其子树的根就在第i+1层。其双亲在同一层的结点互为堂兄弟。

树中结点的最大层次称为树的深度(Depth)或高度。

如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称为该树为有序树,否则称为无序树。

森林(Forest)是m(m>=0)颗互不相交的树的集合。对于树中每个结点而言,其子树的集合即为森林。

对比线性表和树结构,它们有很多的不同:

线性表:

第一个数据元素:无前驱;最后一个数据元素:无后继;中间元素:一个前驱一个后继

树结构:

根结点:无双亲,唯一;叶结点:无孩子,可以多个;中间结点:一个双亲多个孩子。

2、树的存储结构

树的存储结构不能用简单的顺序存储结构来实现。但是,可以充分利用顺序存储结构和链式存储结构的特点,完全可以实现对树的存储结构的表示。

这里要介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。

2.1 双亲表示法

以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在数组中的位置。也就是说结点不仅知道自己是who,还知道它的parent在哪。

表示为

data parent

其中,data是数据域,存储结点的数据信息,而parent是指针域,存储该结点的双亲在数组中的下标。约定根结点的为位置域设置为-1,这意味着我们所有的结点都存有它的双亲的位置。

这样的存储结构,我们可以根据结点的parent指针很容易找到它的双亲结点,所用的时间复杂度为O(1),直到parent为-1,表示找到了树结点的根。

那么,如果我们要是想知道结点的孩子是什么,我们可以增加一个结点最左边孩子的域,不妨叫它长子域,这样就可以很容易得到结点的孩子。如果没有孩子的结点,这个长子域不妨设为-1.

若我们关注各兄弟之间的关系,可以增加一个右兄弟域来体现兄弟关系,每一个结点如果它存在右兄弟,则记录右兄弟的下标,如果不存在,记录为-1。

存储结构的设计是一个非常灵活的过程,一个存储结构设计是否合理,取决于基于该存储结构的运算是否合适、是否方便,时间复杂度好不好等。

2.2 孩子表示法

由于树中每个结点可能有很多棵子树的根结点,我们把这种方法叫做多重链表表示法。不过,树的每个结点的度是不同的,所以设计两种方案解决。

2.2.1 方案一:指针域的个数等于树的度。

data child1 child2 child3
……

childd

其中,data是数据域,child1到childd是指针域,用来指向该结点的孩子结点。

缺点:浪费空间,有些结点的指针域都是空的,

2.2.2 方案二:每个结点指针域的个数等于该结点的度,取一个位置专门存储结点指针域的个数

data degree child1 child2 …… childd

其中,data是数据域,degree是度域,也就是存储该结点的孩子结点的个数,child1到childd为指针域,指向该结点的各个孩子的结点。

缺点:带来时间上的浪费

2.2.3 优化的结构

孩子表示法:把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点,则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

为此,设计两种结点结构。一个是孩子链表的的孩子结点,如

child next

其中,child是数据域,用来存放某个结点在表态数组中的下标,next是指针域,用来存储向某结点的下一个孩子结点的指针。

另一个是表头数组的表头结点,

data firstchild

其中,data是数据域,存储某结点的数据信息,firstchild是头指针域,存储该结点的孩子链表的头指针。

还有一种可以遍历双亲的,称为双亲孩子表示法

2.3 孩子兄弟表示法

任何一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。

data firstchild rightsib

其中,data是数据域,firstchild为指针域,存储该结点的第一个孩子结点的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储地址。

时间: 2024-10-27 10:46:00

大话数据结构(十三)——树的理论知识的相关文章

图的基础算法(大话数据结构笔记)

概述 线性表的每个元素有线性关系,每个数据元素只有一个直接前去和一个直接后继.树的数据元素之间有着明细那的层次关系,并且每层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关.这和一对父母可以有很多孩子,但每个孩子却只能有一对父母是一个道理.可现实中,人与人之间关系复杂,不是简单一对一,一对多的关系.这种复杂关系更适合用图来表示.在图结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关.如下图所示:无向边:Edge (vi,vj)有向边:也叫弧,Arc. <v

数据结构:树与二叉树

大部分笔记摘自<大话数据结构>与<数据结构> 一:相关定义 1.树是n个结点的有限集,n=0时称为空树.在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点:(2)当n>1时,其余结点可分为m个互不相交的有限集,T1.T2.--.Tm,其中每一个集合本身又是一颗树,并且称为根的子树. 2.结点拥有的子树数称为结点的度,而树的度为结点的度的最大值.度为0的结点称为叶结点或终端结点,度不为0的结点称为分支结点.内部结点或非中断结点. 3.结点的子树的根称为结点的孩子,该结点称

堆和栈的理论知识

一.预备知识-程序的内存分配       1. 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)-由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap)-一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)-全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初

Redis研究-3.3数据结构之树与查找、排序等(后续)

3.树.二叉树.森林之间的转换 前面我们又说到,二叉树中的节点我们可以表示成一个具有左孩子域.右孩子域.双亲域.自身数据域的一个数据结构,那么对于一般的树或者森林中的节点来说,能不能也这样子表示呢?答案是可以的,表示成二叉树节点的形式,我们就能很好的使用二叉树的一些特性和算法. 在二叉树中,left表示节点的左孩子.right表示节点的右孩子,那么,对于一般的树节点来看,如果存在孩子,第一个孩子就是对应的left区域,如果有第二个.第三个孩子等,就用right形成一个链表,那么,这种树就转换为二

数据库入门理论知识介绍

数据库入门理论知识介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 前言: 1.目前90%以上的公司面临的运维的瓶颈都在后端 最常见的2大瓶颈就是: 1>.数据库(极难扩展): 2>.存储: 所以说做互联网的运维工程师要是把以上两点问题解决就可以轻松的搞定整个架构 2.什么是数据库: 查百度上有长篇大论了一下数据库特点,我们可以简单的理解: 数据库就是一个存放数据的仓库,这个仓库按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数

计算机编程基础:栈、堆、堆栈概念区分及理论知识

一.预备知识—程序的内存分配  一个由c/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结  构中的栈.  2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构  中的堆是两回事,分配方式倒是类似于链表,呵呵.  3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在  一块区域, 未

大话数据结构之php实现单链表

最近想起来两件事1.大话数据结构和大话设计模式 这两本书很有意思,C语言有指针,所以实现起来容易理解,所以突然想到用PHP写一下来熟悉一下数据结构的线性表,不过看的比较慢.一般两三天才看完一部分,毕竟还要工作,老板还安装摄像头看着每天干了啥.....老板事业兴隆,嘻嘻. 线性表的概念不赘述,直接去看大话数据结构,代码也是在参考众多实现方案,比较符合大话数据结构的原本思想,就是基本上还原C语言的实现过程. 直接上代码 线性表 <?php /*  *文件名:linearList.php   * 功能

oracle rac理论知识

oracle数据库高可靠性高性能的特性是很多企业需要的,这些年一直给各大政府企业做oracle咨询与规划,实施安装以及维护,回头看看,自己已经忘记大部分oracle rac的整体具体架构理论知识,现在回头再复习一次,感觉很清晰. 1.集群相关理论概述 一个集群(cluster)由2个或多个节点(nodes)组成.一般集群对外都会有统一的服务接口(集群地址),对内需要(集群内部通信)不断确定集群内部节点可用,一旦发生异常,可以通过(集群仲裁)驱逐问题Partition,使得集群能够不影响整体对外提

大话数据结构pdf

下载地址:网盘下载 本书为超级畅销书<大话设计模式>作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识.通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析.多算法比较.与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物. 本书以一个计算机教师教学为场景,讲解数据结构和相关算法的知识.通篇?一种趣味方式来叙述,大量引用了各种各样