收藏 分享(赏)

第4章 树结构.ppt

上传人:scg750829 文档编号:8271040 上传时间:2019-06-17 格式:PPT 页数:86 大小:1,016.50KB
下载 相关 举报
第4章 树结构.ppt_第1页
第1页 / 共86页
第4章 树结构.ppt_第2页
第2页 / 共86页
第4章 树结构.ppt_第3页
第3页 / 共86页
第4章 树结构.ppt_第4页
第4页 / 共86页
第4章 树结构.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、第4章 树结构,2019年6月17日,1教学内容二叉树和树的概念、二叉树的遍历及其应用、线索二叉树、哈夫曼树及哈夫曼编码、树和森林与二叉树之间的转换、树或森林的遍历。 教学目的深刻理解二叉树的定义、性质及其存储方法;熟练掌握二叉树的二叉链表存储方式、结点结构和类型定义;掌握二叉树的三种遍历算法;了解二叉树的线索化方法;灵活运用二叉树的遍历方法解决相关的应用问题; 掌握森林与二叉树间的相互转换;掌握树和森林的遍历方法。,2019年6月17日,教学重点:二叉树的定义、逻辑特点及性质;二叉树的存储结构;二叉树的遍历方法及其算法;以遍历为基础在二叉树上实现的几种运算;哈夫曼树和哈夫曼算法;树的存储结构

2、;森林与二叉树的转换。 教学难点:二叉树的递归定义;二叉树链式存储结构的组织方式;三种遍历的算法;二叉树上的复杂运算;哈夫曼算法及其应用;,2019年6月17日,4.1 引言,4.1.1 问题提出线性结构是指元素之间至多有一个前驱元素或一个后继元素的情况,然而在现实生活中或数学抽象中还有一种情况是元素至多有一个前驱元素,而可有多个后继元素的情况,我们称之为树结构。看下面这些问题,它们涉及的数据元素之间的关系是怎样的:问题1:组织结构层次关系的存储与查找。问题2:家族族谱中家族成员之间的关系表示与查找。问题3:图书馆中图书的分类关系的建立。,2019年6月17日,1二叉树的定义二叉树(Binar

3、y Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。,4.1.2 相关概念,2019年6月17日,2树的定义,树(Tree)是n(n0)个有限数据元素的集合。当n0时,称这棵树为空树。在一棵非空树T中:(1) 有一个特殊的数据元素称为树的根结点,根结点没有前驱结点。(2) 若n1,除根结点之外的其余数据元素被分成m(m0)个互不相交的集合T1, T2, , Tm,其中每一个集合Ti(1im)本身又是一棵树。树T1, T2, , Tm称为这

4、个根结点的子树。,2019年6月17日,2019年6月17日,树具有下面两个特点:树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点。树中所有结点可以有零个或多个后继结点。由此特点可知,下图所示的都不是树结构。,2019年6月17日,满二叉树在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。,2019年6月17日,完全二叉树一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1in)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。,201

5、9年6月17日,4.2.1二叉树的基本运算二叉树的基本操作通常有以下几种:(1) Initiate(bt)(2) Create(x, lbt, rbt) (3) InsertL(bt, x, parent) (4) InsertR(bt, x, parent)(5) DeleteL(bt, parent) (6) DeleteR(bt, parent)(7) Search(bt, x) (8) Traverse(bt),4.2 二叉树,2019年6月17日,4.2.2 二叉树的主要性质,性质1 一棵非空二叉树的第i层上最多有2i-1个结点(i1)。 性质2 一棵深度为k的二叉树中,最多具有2k

6、1个结点。 性质3 对于一棵非空的二叉树,若叶子结点数为n0,度数为2的结点数为n2,则有:n0n21。 性质4 具有n个结点的完全二叉树的深度k为:log2n+1,2019年6月17日,性质5: 对于具有n个结点的完全二叉树,如果按照从上至下和从左到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于任意的序号为i的结点,有: 如果i1,则序号为i的结点的双亲结点的序号为i/2;如果i1,则序号为i的结点是根结点,无双亲结点。 如果2in,则序号为i的结点的左孩子结点的序号为2i;如果2in,则序号为i的结点无左孩子。 如果2i1n,则序号为i的结点的右孩子结点的序号为2i1;如果2i1n,

7、则序号为i的结点无右孩子。此外,若对二叉树的根结点从0开始编号,则相应的i号结点的双亲结点的编号为(i1)/2,左孩子的编号为2i1,右孩子的编号为2i2。,2019年6月17日,4.2.3 二叉树的存储,1顺序存储结构所谓二叉树的顺序存储,是用一组连续的存储单元存放二叉树中的结点。一般是按照二叉树结点从上至下、从左到右的顺序存储。因此,依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。,2019年6月17日,下面给出一棵完全二叉

8、树的顺序存储示意。,2019年6月17日,对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点,使之成为一棵完全二叉树的形式,然后再用一维数组顺序存储。,2019年6月17日,极端情况是单支树,如一棵深度为k的右单支树,只有k个结点,却需分配2k1个存储单元。,显然,对于需增加许多空结点才能将一棵二叉树改造成为一棵完全二叉树的存储时,会造成空间的大量浪费,不宜用顺序存储结构。,2019年6月17日,2链式存储结构 (1)二叉链表存储链表中每个结点由三个域组成,除了数据域外,

9、还有两个指针域,分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。结点的存储的结构为:,2019年6月17日,下图(a)给出一棵二叉树的二叉链表存储表示。二叉链表也可以带头结点的方式存放,如图(b)所示。,2019年6月17日,二叉树的二叉链表表示的结点可被定义成如下的二叉树结点类: class LinkBiTNode private DataType data;private LinkBiTNode lchild; private LinkBiTNode rchild;LinkBiTNode (DataType elem, LinkBiTNode lchildval,LinkBiTNo

10、de rchildval) /构造函数1 data=elem;lchild=lchildval;rchild=rchildval; LinkBiTNode (LinkBiTNode lchildval, LinkBiTNode rchildval)/构造函数2 lchild=lchildval;rchild=rchildval; (其他成员函数) ,2019年6月17日,(2)三叉链表存储每个结点由四个域组成,具体结构为:,2019年6月17日,下图给出一棵二叉树的三叉链表存储示意图。,2019年6月17日,4.2.4 二叉树基本运算的实现,算法的实现依赖于具体的存储结构,当二叉树采用不同的存

11、储结构时,上述各种操作的实现算法是不同的。下面讨论基于二叉链表存储结构的上述操作的实现算法。,2019年6月17日,(1) Initiate(bt):建立一棵空的二叉树bt,并返回bt。,2019年6月17日,(2) Create(x,lbt,rbt):生成一棵以x为根结点的数据域值以lbt和rbt为左右子树的二叉树。,2019年6月17日,(3) InsertL(bt, x, parent):在二叉树bt中的parent所指结点和其左子树之间插入数据元素为x的结点,(4) InsertR(bt,x,parent):功能类同于(3) ,算法略。,2019年6月17日,(5)DeleteL(bt

12、,parent):在二叉树bt中删除parent的左子树,(6) DeleteR(bt,parent):算法略。,2019年6月17日,4.3 二叉树的遍历,二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。二叉树遍历是二叉树中最重要最基本的运算。,2019年6月17日,4.3.1 递归方法实现二叉树的三种遍历,由二叉树的定义可知,一棵二叉树由根结点、根结点的左子树和根结点的右子树三部分组成。因此,只要依次遍历这三部分,就可以遍历整个二叉树。若以D、L、R分别表示访问根结点、遍历根结点的左子树、遍历根结点的右子树, 如果限定先左后右,则有三种方式,即:DL

13、R(称为先序遍历) LDR(称为中序遍历) LRD(称为后序遍历) 。,2019年6月17日,1先序遍历 先序遍历的递归过程为:若二叉树为空,遍历结束。否则,(1) 访问根结点;(2) 先序遍历根结点的左子树;(3) 先序遍历根结点的右子树。,2019年6月17日,对于上图所示的二叉树,按先序遍历所得到的结点序列为:A B D G C E F,2019年6月17日,2中序遍历 中序遍历的递归过程为:若二叉树为空,遍历结束。否则, (1) 中序遍历根结点的左子树; (2) 访问根结点; (3) 中序遍历根结点的右子树。,2019年6月17日,对于上图所示的二叉树,按中序遍历所得到的结点序列为:D

14、 G B A E C F,2019年6月17日,3后序遍历 后序遍历的递归过程为:若二叉树为空,遍历结束。否则,(1) 后序遍历根结点的左子树;(2) 后序遍历根结点的右子树;(3) 访问根结点。,2019年6月17日,对于上图所示的二叉树,按后序遍历所得到的结点序列为: G D B E F C A,2019年6月17日,4.3.2 非递归方法实现二叉树的三种遍历,1、包络线 下图中所示的从根结点左外侧开始,由根结点右外侧结束的曲线,称其为该二叉树的包络线,二叉树的遍历是沿着该线路进行的。沿着该路线按标记的结点读得的序列为先序序列,按*标记读得的序列为中序序列,按标记读得的序列为后序序列。,2

15、019年6月17日,2、栈的使用 先序遍历是沿着包络线深入时遇到结点就访问;中序遍历是在从左子树返回时遇到结点访问;后序遍历是在从右子树返回时遇到结点访问。,2019年6月17日,3、遍历算法 (1)先序遍历的非递归实现,2019年6月17日,(2)中序遍历的非递归实现中序遍历的非递归算法的实现,只需将先序遍历的非递归算法中的Visit(p.data)移到p=stacktop和p=p.rchild之间即可。,2019年6月17日,(3)后序遍历的非递归实现特点:每一个结点两次入栈两次出栈。第一次出栈是在它的左子树后序遍历完毕之后,遍历顺序转向出栈结点的右子树,因为还未访问该结点,故还需再次入栈

16、,当该结点的右子树后序遍历完毕之后,此时访问该结点,该结点真正出栈。,2019年6月17日,2019年6月17日,4.3.3 按层次遍历二叉树所谓二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。对于下图所示的二叉树,按层次遍历所得到的结果序列为:A B C D E F G,2019年6月17日,1、队列的使用在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对头取出一个元素,每取一个元素,执行下面两个操作:访问该元素所指结点;若该元素所指结点的左、右孩子结点非空,则将该元素所指结点

17、的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束。,2019年6月17日,2019年6月17日,4.4 二叉树遍历的应用,4.4.1 构造二叉树的二叉链表存储构建一棵二叉树的二叉链表也是基于遍历的过程进行的。这里按照先序遍历的过程构建。首先建立二叉树带空指针的先序次序,依此作为构建时结点的输入顺序,如对于下图所示的二叉树,输入序列为:ABD0G000CE00F00(0表示空,为了简化问题,设数据元素的类型为字符型)。,2019年6月17日,2019年6月17日,4.4.2 在二叉树中查找值为x的数据元素,2019年6月17日,4.4.3 统计给定二叉树中叶子

18、结点的数目,2019年6月17日,4.4.4 表达式计算,可以把任意一个算术表达式用一棵二叉树表示,右图所示为表达式3x2+x-1/x+5的二叉树表示。在表达式二叉树中,每个叶子结点都是操作数,每个非叶子结点都是运算符。对于一个非叶子结点,它的左、右子树分别是它的两个操作数。,2019年6月17日,2、分隔过程:已知一棵二叉树的先序序列与中序序列分别为: A B C D E F G H I , B C A E D G H F I,试恢复该二叉树。,1、依据遍历定义:由二叉树的先序序列和中序序列可唯一地确定该二叉树。由二叉树的后序序列和中序序列也可唯一地确定该二叉树。由二叉树的先序序列和后序序列

19、不能唯一地确定该二叉树。,4.4.5 由遍历序列恢复二叉树,2019年6月17日,2019年6月17日,4.5 线索二叉树,4.5.1 线索二叉树的定义及结构 1线索二叉树的定义按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排列为一个线性序列。在该序列中,除第一个结点外,每个结点有且仅有一个直接前驱结点;除最后一个结点外,每个结点有且仅有一个直接后继结点。但是,二叉树中每个结点在这个序列中的直接前驱结点和直接后继结点是什么,在二叉树的存储结构中并没有反映出来,只能在对二叉树遍历的动态过程中得到这些信息。,2019年6月17日,2线索二叉树的结构 图中实线表示指针,虚线表示线索。,20

20、19年6月17日,指向孩子的指针和线索都是地址,如何区别某结点的指针域内存放的是指针还是线索?方法是为每个结点增设两个标志位域ltag和rtag,令:ltagrtag结点结构为:,2019年6月17日,线索二叉树的结点类定义如下: class LinkBiThrNode private DataType data;private LinkBiThrNode lchild;private LinkBiThrNode rchild;private short ltag;private short rtag;LinkBiThrNode (DataType elem, LinkBiTNode lchi

21、ldval,LinkBiTNode rchildval,int i, int j) /构造函数1 data=elem;lchild=lchildval;rchild=rchildval;ltag=i;rtag=j; LinkBiThrNode (LinkBiTNode lchildval, LinkBiTNode rchildval) /构造函数2 lchild=lchildval;rchild=rchildval; (其他成员函数) ,2019年6月17日,4.5.2 线索二叉树的构建,2019年6月17日,1在中序线索树上查找任意结点的中序前驱结点,4.5.3 线索二叉树的遍历,2019年

22、6月17日,2在中序线索树上查找某结点的中序后继结点,2019年6月17日,3线索树的遍历,2019年6月17日,4在中序线索二叉树上的更新线索二叉树的更新是指,在线索二叉树中插入一个结点或者删除一个结点。一般情况下,这些操作有可能破坏原来已有的线索,因此,在修改指针时,还需要对线索做相应的修改。 讨论一种比较简单的情况,即在中序线索二叉树中插入一个结点p,使它成为结点s的右孩子。,2019年6月17日,2019年6月17日,4.6 最优二叉树,4.6.1问题的引入一个将百分制转换为五级分制的判定程序可以用以下条件语句完成:if (a60) b=”bad”;else if (a70) b=”p

23、ass”else if (a80) b=”general”else if (a90) b=”good”else b=”excellent”; 判定过程如下图所示。,2019年6月17日,判定方法是多样的,也可以采用下面的判定过程来完成。,2019年6月17日,在给定一组具有确定权值的叶结点,可以构造出不同的带权二叉树。下图中的每棵二叉树都有4个结点,且权值相同,但其带权路径长度不同,分别为:(a)WPL1232527232(b)WPL1333527129(c)WPL1233537133(d)WPL7353321143 (e)WPL7152331329,2019年6月17日,3哈夫曼(Haffm

24、an)树:哈夫曼树也称最优二叉树。由上面的例子可见,由相同权值的一组叶子结点所构成的二叉树可能有不同的形态和不同的带权路径长度,具有最小带权路径长度的二叉树称为哈夫曼(Haffman)树,也称最优二叉树。最优二叉树在实际问题中有很重要的应用。,2019年6月17日,下图给出前面提到的叶结点权值集合为W1,3,5,7的哈夫曼树的构造过程。可以计算出其带权路径长度为29。,2019年6月17日,2、算法实现,2019年6月17日,4.6.3 最优二叉树的应用-哈夫曼编码,2019年6月17日,4.7 树,4.7.1树的基本操作 树的基本操作通常有以下几种: Initiate(t)Root(x)Pa

25、rent(t,x) Child(t,x,i) RightSibling(t,x) Insert(t,x,i,s) Delete(t,x, i) Tranverse(t),2019年6月17日,4.7.2 树的表示,1直观表示法,2019年6月17日,2嵌套集合表示法,2019年6月17日,3凹入表示法,4广义表表示法(A(B(D,E(H,I),F),C(G),2019年6月17日,4.7.3 树的存储,1双亲链表存储方法,2019年6月17日,2指向孩子的链表存储方法 多重链表法令每个结点包括一个结点信息域和多个指针域,每个指针域指向该结点的一个孩子结点,通过各个指针域值反映出树中各结点之间的

26、逻辑关系。在这种表示法中,树中每个结点有多个指针域,形成了多条链表,所以这种方法又常称为多重链表法。,2019年6月17日,孩子链表表示法,2019年6月17日,3双亲孩子链表存储方法,2019年6月17日,4孩子兄弟链表存储方法,从树的孩子兄弟表示法可以看到,如果设定一定规则,就可用二叉树结构表示树和森林,这样,对树的操作实现就可以借助二叉树存储,利用二叉树上的操作来实现。,2019年6月17日,4.7.4 树和森林与二叉树之间的转换,1. 树转换为二叉树,2019年6月17日,下图给出森林及其转换为二叉树的过程。,2. 森林转换为二叉树,2019年6月17日,下图给出一棵二叉树还原为森林的

27、过程示意。,3. 二叉树转换为树和森林,2019年6月17日,1. 树的遍历,(1)先序遍历,按照树的先根遍历的定义,对上图所示的树进行先根遍历,得到的结果序列为:A B E F C D G,4.7.5 树或森林的遍历,2019年6月17日,2后序遍历 按照树的后序遍历的定义,对下图所示的树进行后根遍历,得到的结果序列为:E F B C G D A,2019年6月17日,2. 森林的遍历,(1)先序遍历 对于下图所示的森林进行前序遍历,得到的结果序列为:A B C D E F G H J I K,2019年6月17日,(2)后序遍历 对于下图所示的森林进行中序遍历,得到的结果序列为:B A D E F C J H K I G,2019年6月17日,4.7.6 树的应用,1、集合的表示,2019年6月17日,2.集合的运算,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报