《大话数据结构》笔记(6-1)--树:树

代码实现:

https://github.com/Lyu0709/data-structure/blob/master/src/com/coding/basic/tree/Tree.java

第六章    树

树的定义

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

结点拥有的子树数称为结点的度(degree)

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

除根结点之外,分支结点也称为内部结点。

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

结点的子树的根称为该节点的孩子(Child),相应的,该结点称为孩子的Parent

同一个Parent的孩子之间互称兄弟(Sibling)。

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

结点的层次(Level)从根开始定义起。其Parent在同一层的结点互为堂兄弟。

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

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

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

树的抽象数据类型

树的存储结构

双亲表示法

假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。

结点结构定义代码:

约定根结点的位置域设置为-1

根据结点的parent指针很容易找到它的双亲结点,所用的时间复杂度为O(1);如果想要知道结点的孩子是什么,则需要遍历整个结构才行。

改进:

可以把此结构扩展为双亲域、长子域、右兄弟域等。

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

孩子表示法

每个结点有多个指针域,其中每个指针指向一棵子树的根结点,我们把这个方法叫做多重链表表示法。

由于树的每个结点的度不相同,所以有两种方案来解决。

方案一

指针域的个数等于树的度。

这种方法对于树中各节点的度相差很大时,显然是浪费空间的。不过如果树的各结点度相差很小时,就意味着开辟的空间被充分利用了,这时存储结构的缺点反而变成了优点。

方案二

每个结点指针域的个数等于该结点的度。

这种方法克服了浪费空间的缺点,对空间利用率是提高了,但是由于各个结点的链表是不相同的结构,加上要维护结点的度的数值,在运算上就会带来时间上的损耗。

有没有什么方法,既可以减少空指针的浪费又能使结点各结构相同?

孩子表示法

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

为此,需要设计两种结点结构,一个是孩子链表的孩子结点另一个是表头数组的表头结点

孩子表示法的结构定义代码:

这里存在的问题是需要遍历整棵树才知道某个结点的双亲。

改进

双亲孩子表示法

孩子兄弟表示法

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

所有有必要知道父结点,完全可以再增加一个parent指针域来解决快速查找双亲的问题。

其实这个表示法的最大好处是它把一棵复杂的树变成了一棵二叉树。

时间: 2024-10-25 11:39:08

《大话数据结构》笔记(6-1)--树:树的相关文章

34. 蛤蟆的数据结构笔记之三十四树的概念

34. 蛤蟆的数据结构笔记之三十四树的概念 本篇名言:"过去属于死神,未来属于你自己.--雪莱" 本篇笔记开始我们要进入新的概念了,树!是不是有点小激动呢?让我们从概念开始吧 当然概念要理解,如果当前不能立刻理解,可以后续结合代码一起理解效果更佳. 1.  树型结构 之前我们学习的那么多,其实都是线性数据结构. 树 则不同,它是非线性结构. 树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构,是一类重要的非线性数据结构.在树形结构中,树根结点没有前驱结点

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

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

《大话数据结构》--- 第六章 树

树是n个结点的有限集.n = 0时称为空树.在任何一棵非空树中: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n > 1时,其余节点可分为位数个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树. 树的结点包含一个数据元素及若干指向其子树的分支.结点拥有的子树树称为结点的度.度为0的结点称为叶结点或终端结点:度不为0的结点称为非终端结点或分支结点.除根结点之外,分支结点也称为内部结点.树的度是树内各节点的度的最大值. 结点的子树的根称为该结点的孩子,相应的,该结点成

数据结构 笔记 part3 (字典树 &amp;&amp; 扫描线)

一:概念 下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢? 从上面的图中,我们或多或少的可以发现一些好玩的特性. 第一:根节点不包含字符,除根节点外的每一个子节点都包含一个字符. 第二:从根节点到某一节点,路径上经过的字符连接起来,就是该节点对应的字符串. 第三:每个单词的公共前缀作为一个字符节点保存. 二:使用范围 既然学Trie树,我们肯定要知道这玩意是用来干嘛的. 第一:词频统计. 可能有人要说了,词频统计简单啊,一个hash或者一个堆就可以打完收工,但问题

【学习总结】《大话数据结构》- 第9章-排序

[学习总结]<大话数据结构>- 总 启示: 树 目录 6.1 开场白 6.2 树的定义 6.3 树的抽象数据类型 6.4 树的存储结构 6.5 二叉树的定义 6.6 二叉树的性质 6.7 二叉树的存储结构 6.8 遍历二叉树 6.9 二叉树的建立 6.10 线索二叉树 6.11 树.森林与二叉树的转换 6.12 赫夫曼树及其应用 6.13 总结回顾 6.14 结尾语 ---------------------------------------------- 6.1 开场白 一些可以略过的场面

数据结构基础温故-4.树与二叉树(上)

前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系.树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构.树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可以表示层次关系.本文重点讨论树与二叉树的基本结构和遍历算法等内容. 一.好大一棵树,绿色的祝福 1.1 树的基本概念 Defination:树(Tree)是 n(n≥0)个结点的有限集.n=0时,该树

数据结构基础温故-4.树与二叉树(中)

在上一篇中,我们了解了树的基本概念以及二叉树的基本特点和代码实现,还用递归的方式对二叉树的三种遍历算法进行了代码实现.但是,由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多.而且,如果递归深度太大,可能系统撑不住.因此,我们使用非递归(这里主要是循环,循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销)来重新实现一遍各种遍历算法,再对二叉树的另外一种特殊的遍历—层次遍历进行实现,最后再了解一下特殊的二叉树—二叉查找树. 一.递归与循环的区别及

【大话数据结构】 部分读书笔记

章节 笔记 1.数据结构绪论 数据结构:相互之间存在一种或多种特定关系的数据元素集合. 数据:是描述客观事物的符号,计算机可以操作的对象,符号集合. 数据元素:是组成数据的.有一定意义的基本单位,也称为记录.如人类中的人. 数据项:一个数据元素可以由若干个数据项组成.如人的眼.耳.是不可分割的最小单位. 数据对象:是性质相同的数据元素的集合,是数据的子集.如人都有姓名等相同的数据项. 逻辑结构:是指数据对象中数据元素之间的相互关系.含集合(无关联).线性(一对一).树形(一对多层次关系).图形(

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于