您好,欢迎访问三七文档
树结构是一种比线性结构更复杂的数据结构,比较适合描述具有层次关系的数据结构。树结构在计算机领域中有着广泛的应用编译程序中的语法树;数据挖掘中用决策树来进行数据分类。第5章树和二叉树树的逻辑结构树的存储结构二叉树的逻辑结构二叉树的存储结构及实现二叉树遍历的非递归算法树、森林与二叉树的转换哈夫曼树和哈夫曼编码第5章树和二叉树本章的主要内容是:本章学习重点树的遍历二叉树的性质二叉树和树的存储表示二叉树的遍历树与二叉树之间的转换哈夫曼树第5章树和二叉树树的定义树:n(n≥0)个结点的有限集合。当n=0时,称为空树;任意一棵非空树满足以下条件:⑴有且仅有一个特定的称为根的结点;⑵当n>1时,除根结点之外的其余结点被分成m(m0)个互不相交的有限集合T1,T2,…,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。5.1树的逻辑结构树的定义是采用递归方法(a)一棵树结构(b)一个非树结构(c)一个非树结构5.1树的逻辑结构树的定义ACBGFEDHIACBGFDACBGFDE树的应用举例——文件结构5.1树的逻辑结构MyComputerC:D:E:etcWINDOWSProgramFilesPictureMusic…………………………………………树的基本术语结点的度:结点所拥有的子树的个数。树的度:树中各结点度的最大值。5.1树的逻辑结构CGBDEFKLHMIJA5.1树的逻辑结构叶子结点:度为0的结点,也称为终端结点。分支结点:度不为0的结点,也称为非终端结点。CGBDEFKLHMIJA树的基本术语孩子、双亲:树中某结点子树的根结点称为这个结点的孩子结点,这个结点称为它孩子结点的双亲结点;兄弟:具有同一个双亲的孩子结点互称为兄弟。5.1树的逻辑结构CGBDEFKLHMIJA树的基本术语路径:如果树的结点序列n1,n2,…,nk有如下关系:结点ni是ni+1的双亲(1=ik),则把n1,n2,…,nk称为一条由n1至nk的路径;路径上经过的边的个数称为路径长度。CGBDEFKLHMIJA5.1树的逻辑结构树的基本术语祖先、子孙:在树中,如果有一条路径从结点x到结点y,则x称为y的祖先,而y称为x的子孙。5.1树的逻辑结构CGBDEFKLHMIJA树的基本术语结点所在层数:根结点的层数为1;对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层。树的深度:树中所有结点的最大层数,也称高度。1层2层4层3层高度=4CGBDEFKLHMIJA5.1树的逻辑结构树的基本术语CBDEFKLHJA71234568910层序编号:将树中结点按照从上层到下层、同层从左到右的次序依次给他们编以从1开始的连续自然数。5.1树的逻辑结构树的基本术语有序树、无序树:如果一棵树中结点的各子树从左到右是有次序的,称这棵树为有序树;反之,称为无序树。数据结构中讨论的一般都是有序树5.1树的逻辑结构树的基本术语ACBGFEDACBGFEDCBDEFKLHJ森林:m(m≥0)棵互不相交的树的集合。5.1树的逻辑结构树的基本术语A树结构和线性结构的比较线性结构树结构第一个数据元素根结点(只有一个)无前驱无双亲最后一个数据元素叶子结点(可以有多个)无后继无孩子其它数据元素其它结点一个前驱,一个后继一个双亲,多个孩子一对一一对多5.1树的逻辑结构树的抽象数据类型定义ADTTreeData树是由一个根结点和若干棵子树构成,树中结点具有相同数据类型及层次关系Operation5.1树的逻辑结构树的应用很广泛,在不同的实际应用中,树的基本操作不尽相同。下面给出一个树的抽象数据类型定义的例子,简单起见,基本操作只包含树的遍历,针对具体应用,需要重新定义其基本操作。InitTree前置条件:树不存在输入:无功能:初始化一棵树输出:无后置条件:构造一个空树DestroyTree前置条件:树已存在输入:无功能:销毁一棵树输出:无后置条件:释放该树占用的存储空间树的抽象数据类型定义5.1树的逻辑结构PreOrder前置条件:树已存在输入:无功能:前序遍历树输出:树的前序遍历序列后置条件:树保持不变PostOrder前置条件:树已存在输入:无功能:后序遍历树输出:树的后序遍历序列后置条件:树保持不变endADT树的抽象数据类型定义5.1树的逻辑结构树的遍历操作树的遍历:从根结点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。如何理解访问?抽象操作,可以是对结点进行的各种处理,这里简化为输出结点的数据。如何理解次序?树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。5.1树的逻辑结构树结构(非线性结构)→线性结构。遍历的实质?前序遍历树的前序遍历操作定义为:若树为空,则空操作返回;否则⑴访问根结点;⑵按照从左到右的顺序前序遍历根结点的每一棵子树。5.1树的逻辑结构前序遍历序列:ABDEHIFCGACBGFEDHI后序遍历树的后序遍历操作定义为:若树为空,则空操作返回;否则⑴按照从左到右的顺序后序遍历根结点的每一棵子树;⑵访问根结点。5.1树的逻辑结构后序遍历序列:DHIEFBGCAACBGFEDHI层序遍历树的层序遍历操作定义为:从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。5.1树的逻辑结构层序遍历序列:ABCDEFGHIACBGFEDHI5.2树的存储结构实现树的存储结构,关键是什么?什么是存储结构?树中结点之间的逻辑关系是什么?思考问题的出发点:如何表示结点的双亲和孩子。如何表示树中结点之间的逻辑关系。数据元素以及数据元素之间的逻辑关系在存储器中的表示。双亲表示法基本思想:用一维数组来存储树的各个结点(一般按层序存储),数组中的一个元素对应树中的一个结点,包括结点的数据信息以及该结点的双亲在数组中的下标。5.2树的存储结构dataparentdata:存储树中结点的数据信息parent:存储该结点的双亲在数组中的下标templateclassDataTypestructPNode{DataTypedata;//数据域intparent;//指针域,双亲在数组中的下标};dataparent5.2树的存储结构树的双亲表示法实质上是一个静态链表。双亲表示法下标dataparent012345678A-1B0C0D1E1F1G2H2I45.2树的存储结构如何查找双亲结点?时间性能?双亲表示法ACBHFEDGI5.2树的存储结构双亲表示法ACBHFEDGI如何查找孩子结点?时间性能?下标dataparentfirstchild136-18-1-1-1-1012345678A-1B0C0D1E1F1G2H2I4下标dataparentrightsib-12-145-17-1-15.2树的存储结构双亲表示法012345678A-1B0C0D1E1F1G2H2I4ACBHFEDGI如何查找兄弟结点?时间性能?链表中的每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。如何表示孩子?5.2树的存储结构孩子链表表示法方案一:指针域的个数等于树的度datachild1child2……childd其中:data:数据域,存放该结点的数据信息;child1~childd:指针域,指向该结点的孩子。5.2树的存储结构∧缺点:浪费空间!ACBHFEDGIA∧B∧C∧D∧E∧F∧G∧H∧I∧∧∧∧∧∧∧∧∧∧∧链表中的每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。如何表示孩子?5.2树的存储结构孩子链表表示法方案二:指针域的个数等于该结点的度datadegreechild1child2……childd其中:data:数据域,存放该结点的数据信息;degree:度域,存放该结点的度;child1~childd:指针域,指向该结点的孩子。5.2树的存储结构缺点:结点结构不一致!ACBHFEDGIA2B3C2E1I0G0H0F0D0孩子链表表示法孩子链表的基本思想:把每个结点的孩子排列起来,看成是一个线性表,且以单链表存储,则n个结点共有n个孩子链表。这n个单链表共有n个头指针,这n个头指针又组成了一个线性表,为了便于进行查找采用顺序存储。最后,将存放n个头指针的数组和存放n个结点的数组结合起来,构成孩子链表的表头数组。5.2树的存储结构如何表示孩子?将结点的所有孩子放在一起,构成线性表。childnext孩子结点structCTNode{intchild;CTNode*next;};5.2树的存储结构templateclassDataTypestructCBNode{DataTypedata;CTNode*firstchild;};孩子链表表示法datafirstchild表头结点ACBHFEDGI012345678下标datafirstchildABCDEFGHI∧∧∧∧5.2树的存储结构如何查找孩子结点?时间性能?∧12∧345∧7∧68∧ACBHFEDGI012345678下标datafirstchildABCDEFGHI∧∧∧∧∧5.2树的存储结构12∧345∧7∧68∧如何查找双亲结点?时间性能?双亲孩子表示法5.2树的存储结构012345678A-1B0C0D1∧E1F1∧G2∧H2∧I4∧dataparentfirstchild12∧345∧7∧68∧ACBHFEDGI孩子兄弟表示法5.2树的存储结构ACBHFEDGI某结点的第一个孩子是惟一的某结点的右兄弟是惟一的设置两个分别指向该结点的第一个孩子和右兄弟的指针templateclassDataTypestructTNode{DataTypedata;TNodeDataType*firstchild,*rightsib;};5.2树的存储结构结点结构firstchilddatarightsibdata:数据域,存储该结点的数据信息;firstchild:指针域,指向该结点第一个孩子;rightsib:指针域,指向该结点的右兄弟结点。孩子兄弟表示法5.2树的存储结构孩子兄弟表示法ACBHFEDGIABCDEFGHI∧∧∧∧∧∧∧∧∧∧如何查找兄弟结点?时间性能?5.2树的存储结构孩子兄弟表示法ACBHFEDGIABCDEFGHI∧∧∧∧∧∧∧∧∧∧如何查找孩子结点?时间性能?二叉树的定义二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。5.3二叉树的逻辑结构问题转化:将树转换为二叉树,从而利用二叉树解决树的有关问题。研究二叉树的意义?二叉树的特点⑴每个结点最多有两棵子树;⑵二叉树是有序的,其次序不能任意颠倒。5.3二叉树的逻辑结构注意:二叉树和树是两种树结构。ABCDEFGABAB二叉树的基本形态Ф空二叉树只有一个根结点左子树根结点只有左子树右子树根结点只有右子树左子树右子树根结点同时有左右子树5.3二叉树的逻辑结构5.3二叉树的逻辑结构具有3个结点的树和具有3个结点的二叉树的形态:二叉树和树是两种树结构。特殊的二叉树斜树1.所有结点都只有左子树的二叉树称为左斜树;2.所有结点都只有右子树的二叉树称为右斜树;3.左斜树和右斜树统称为斜树。1.在斜树中,每一层只有一个结点;2.斜树的结点个数与其深度相同。5.3二叉树的逻辑结构斜树的特点:ABCABC满二叉树在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。满二叉树的特点:1.叶子只能出现在最下一层;2.只有度为0和度为2的结点。5.3二叉树的逻辑结构特殊的二叉树A15234678910BCDEFGHIJKLMNO1112131415满二叉树5.3二叉树的逻辑结构不是满二叉树,虽然所有分支结点都有左右子树,但叶子不在同一层上。满二叉树在同样深度的二叉树中结点个数最多满二叉树在同样深度的二叉树中叶子结点个数最多A1523467BCDEFGLM89特殊的二叉树
本文标题:第5章树和二叉树.
链接地址:https://www.777doc.com/doc-2110531 .html