书签 分享 收藏 举报 版权申诉 / 81
上传文档赚钱

类型数据结构课件第六章.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4106216
  • 上传时间:2022-11-11
  • 格式:PPT
  • 页数:81
  • 大小:510.86KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《数据结构课件第六章.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    数据结构 课件 第六
    资源描述:

    1、数据结构课程的内容数据结构课程的内容1第第6章章 树和二叉树(树和二叉树(Tree&Binary Tree)6.1 树的基本概念树的基本概念6.2 二叉树二叉树6.3 遍历二叉树和线索二叉树遍历二叉树和线索二叉树6.4 树和森林树和森林6.5 赫夫曼树及其应用赫夫曼树及其应用特点:特点:非线性结构,一个直接前驱,但可能有多个非线性结构,一个直接前驱,但可能有多个直接后继(直接后继(1 1:n n)26.1 树的基本概念1.树的定义树的定义2 若干术语若干术语3.逻辑结构逻辑结构4.存储结构存储结构5.树的运算树的运算31.树的定义树的定义注注1:过去许多书籍中都定义树为过去许多书籍中都定义树为

    2、n1,曾经有曾经有“空树不是空树不是树树”的说法,但现在树的定义已修改。的说法,但现在树的定义已修改。注注2:树的定义具有树的定义具有递归性递归性,即树中还有树。,即树中还有树。由一个或多个由一个或多个(n0n0)结点组成的有限集合结点组成的有限集合T T,有且有且仅有仅有一个结点称为根一个结点称为根(rootroot),),当当n1n1时,其余的结点时,其余的结点分为分为m(m0)m(m0)个个互不相交互不相交的有限集合的有限集合T1,T2T1,T2,TmTm。每每个集合本身又是棵树,被称作这个根的个集合本身又是棵树,被称作这个根的子树子树 。4树的表示法有几种:树的表示法有几种:图形表示法

    3、图形表示法嵌套集合表示法嵌套集合表示法广义表表示法广义表表示法目录表示法目录表示法左孩子右兄弟表示法左孩子右兄弟表示法这些表示法的示意图这些表示法的示意图参见教材参见教材P120P120树的抽象数据类型定义树的抽象数据类型定义参参见教材见教材P118-119P118-1195图形表示法:图形表示法:教师教师学生学生其他人员其他人员20032003级级 20042004级级 20052005级级20062006级级河南大学河南大学物理系物理系计算机系计算机系化学系化学系叶子叶子根根子树子树6广义表表示法广义表表示法(A(B(E(K,L),F),C(G),D(H(M),I,J)根作为根作为由子树森

    4、林组成的由子树森林组成的表的名字写在表的左边表的名字写在表的左边datalink 1 link 2.link n麻烦问题:应当开设多少个链域麻烦问题:应当开设多少个链域?7左孩子右兄弟表示法左孩子右兄弟表示法数据数据左孩子左孩子 右兄弟右兄弟(A(B(E(K,L),F),C(G),D(H(M),I,J)8 树的抽象数据类型定义树的抽象数据类型定义(见教材(见教材P118-119P118-119)ADT Tree数据对象数据对象D:数据关系数据关系R:基本操作基本操作 P:ADT Tree若若D为空集,则称为空树;为空集,则称为空树;/允许允许n=0若若D中仅含一个数据元素,则中仅含一个数据元素

    5、,则R为空集;为空集;其他情况下的其他情况下的R存在二元关系:存在二元关系:root 唯一唯一 /关于根的说明关于根的说明 DjDk=/关于子树不相交的说明关于子树不相交的说明 /关于数据元素的说明关于数据元素的说明D是具有相同特性的数据元素的集合。是具有相同特性的数据元素的集合。/至少有至少有15个个92.若干术语若干术语即上层的那个结点即上层的那个结点(直接前驱直接前驱)即下层结点的子树的根即下层结点的子树的根(直接后继直接后继)同一双亲下的同层结点(孩子之间互称兄弟)同一双亲下的同层结点(孩子之间互称兄弟)即双亲位于同一层的结点(但并非同一双亲)即双亲位于同一层的结点(但并非同一双亲)即

    6、从根到该结点所经分支的所有结点即从根到该结点所经分支的所有结点即该结点下层子树中的任一结点即该结点下层子树中的任一结点ABCGEIDHFJMLK 根根 叶子叶子 森林森林有序树有序树无序树无序树即根结点即根结点(没有前驱没有前驱)即终端结点即终端结点(没有后继没有后继)指指m棵不相交的树的集棵不相交的树的集合合(例如删除例如删除A后的子树个数后的子树个数)双亲双亲孩子孩子兄弟兄弟堂兄弟堂兄弟祖先祖先子孙子孙结点各子树从左至右有序,不能互换(左为第一)结点各子树从左至右有序,不能互换(左为第一)结点各子树可互换位置。结点各子树可互换位置。102.若干术语(续)若干术语(续)即树的数据元素即树的数

    7、据元素结点挂接的子树数结点挂接的子树数(有几个直接后继就是几度(有几个直接后继就是几度,亦称,亦称“次数次数”)结点结点结点的度结点的度结点的层次结点的层次终端结点终端结点分支结点分支结点树的度树的度树的深度树的深度(或高度或高度)ABCGEIDHFJMLK从根到该结点的层数(根结点算第一层)从根到该结点的层数(根结点算第一层)即度为即度为0的结点,即叶子的结点,即叶子即度不为即度不为0的结点(也称为内部结点)的结点(也称为内部结点)所有结点度中的最大值(所有结点度中的最大值(Max各结点的度各结点的度)指所有结点中最大的层数(指所有结点中最大的层数(Max各结点的层次各结点的层次)问:问:右

    8、上图中的结点数右上图中的结点数 ;树的度;树的度 ;树的深度;树的深度13133 34 4113.树的逻辑结构树的逻辑结构(特点特点):一对多(一对多(1:n1:n),),有多个直接后继(如家谱有多个直接后继(如家谱树、目录树等等),但只有一个根结点,树、目录树等等),但只有一个根结点,且且子树之间互不相交子树之间互不相交。4.树的存储结构树的存储结构 讨论讨论1:树是非线性结构,该怎样存储?树是非线性结构,该怎样存储?仍然有顺序存储、链式存储等方式。仍然有顺序存储、链式存储等方式。12讨论讨论3:树的树的链式存储链式存储方案应该怎样制定?方案应该怎样制定?可规定为:可规定为:从上至下、从左至

    9、右从上至下、从左至右将树的结点依次存入内存。将树的结点依次存入内存。重大缺陷:复原困难(不能唯一复原就没有实用价值)。重大缺陷:复原困难(不能唯一复原就没有实用价值)。讨论讨论2:树的树的顺序存储顺序存储方案应该怎样制定?方案应该怎样制定?可用多重链表:可用多重链表:一个前趋指针,一个前趋指针,n n个后继指针。个后继指针。细节问题:细节问题:树中结点的结构类型样式该如何设计?树中结点的结构类型样式该如何设计?即应该设计成即应该设计成“等长等长”还是还是“不等长不等长”?缺点:缺点:等长结构太浪费(每个结点的度不一定相同);等长结构太浪费(每个结点的度不一定相同);不等长结构太复杂(要定义好多

    10、种结构类型)。不等长结构太复杂(要定义好多种结构类型)。解决思路:解决思路:先研究最简单、最有规律的树,然后设法把先研究最简单、最有规律的树,然后设法把一般的树转化为简单树。一般的树转化为简单树。135.树的运算树的运算 要明确:要明确:1.普通树(即多叉树)若不转化为二叉树,则运普通树(即多叉树)若不转化为二叉树,则运算很难实现。算很难实现。2.二叉树的运算仍然是插入、删除、修改、查找、二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操作必须建立在排序等,但这些操作必须建立在对树结点能够对树结点能够“遍历遍历”的基础上!的基础上!(遍历遍历指每个结点都被访问且仅访问一次,指每个结点都

    11、被访问且仅访问一次,不遗漏不重复)。不遗漏不重复)。本章重点:二叉树的表示和实现本章重点:二叉树的表示和实现146.2 6.2 二叉树二叉树为何要重点研究每结点最多只有两个为何要重点研究每结点最多只有两个“叉叉”的树?的树?二叉树的结构最简单,规律性最强;二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二叉树,不失一般性。可以证明,所有树都能转为唯一对应的二叉树,不失一般性。1.二叉树的定义二叉树的定义2.二叉树的性质二叉树的性质3.二叉树的存储结构二叉树的存储结构(二叉树的运算二叉树的运算见见6.3节节)15定义:定义:是是n(n0)个结点的有限集合,由一个根结点以及两个结

    12、点的有限集合,由一个根结点以及两棵互不相交的、分别称为棵互不相交的、分别称为左子树和右子树左子树和右子树的二叉树组成的二叉树组成。逻辑结构:逻辑结构:一对二(一对二(1:2)基本特征基本特征:每个结点最多只有两棵子树(不存在度大于每个结点最多只有两棵子树(不存在度大于2 2的结点);的结点);左子树和右子树次序不能颠倒(有序树)。左子树和右子树次序不能颠倒(有序树)。基本形态:基本形态:5种种/2种种16二叉树的抽象数据类型定义二叉树的抽象数据类型定义(见教材(见教材P P121-122121-122)ADT BinaryTree数据对象数据对象D:数据关系数据关系R:基本操作基本操作 P:A

    13、DT BinaryTree若若D=,则,则R=;若若D,则,则R=H;存在二元关系:存在二元关系:root 唯一唯一 /关于根的说明关于根的说明 DjDk=/关于子树不相交的说明关于子树不相交的说明 /关于数据元素的说明关于数据元素的说明 /关于左子树和右子树的说明关于左子树和右子树的说明D是具有相同特性的数据元素的集合。是具有相同特性的数据元素的集合。/至少有至少有20个个17讨论讨论1 1:第:第i i层的结点数至多是多少?层的结点数至多是多少?(利用二进制性质可轻松求出)(利用二进制性质可轻松求出)性质性质1:1:在二叉树的第在二叉树的第i i层上至多有层上至多有个结点(个结点(i0i0

    14、)。)。性质性质2:2:深度为深度为k k的二叉树至多有的二叉树至多有个结点(个结点(k0k0)。)。2 2i-1i-1个个提问:第提问:第i i层上至少有层上至少有 个结点?个结点?1 1讨论讨论2 2:深度为:深度为k k的二叉树,至多有多少个结点?的二叉树,至多有多少个结点?(利用二进制性质可轻松求出)(利用二进制性质可轻松求出)2 2k k-1-1提问:深度为提问:深度为k k时至少有时至少有 个结点?个结点?k k18讨论讨论3 3:二叉树的叶子数和度为:二叉树的叶子数和度为2 2的结点数之间有关系吗?的结点数之间有关系吗?性质性质3:3:对于任何一棵二叉树,若对于任何一棵二叉树,若

    15、2 2度的结点数有度的结点数有n n2 2个,个,则叶子数(则叶子数(n n0 0)必定为必定为n n2 21 1(即(即n0=n2+1)二叉树中全部结点数二叉树中全部结点数nn0+n1+n2(叶子数叶子数1 1度结点数度结点数2 2度结点数度结点数)二叉树中全部结点数二叉树中全部结点数nB+1 (总分支数根结点总分支数根结点 )(除根结点外,每个结点必有一个直接前趋,即一个分支)(除根结点外,每个结点必有一个直接前趋,即一个分支)总分支数总分支数B=n1+2n2 (1(1度结点必有度结点必有1 1个直接后继,个直接后继,2 2度结点必有度结点必有2 2个个)n0+n1+n2=n1+2n2+1

    16、,即即n0=n2+1实际意义:实际意义:叶子数叶子数2 2度结点数度结点数1 1ABCGEIDHFJ19满二叉树:满二叉树:一棵深度为一棵深度为k 且有且有2k-1个结点的二叉树。个结点的二叉树。(特点:每层都(特点:每层都“充满充满”了结点了结点)完全二叉树:完全二叉树:深度为深度为k 的的,有有n个结点个结点的二叉树,当且仅当其每一个结点都与的二叉树,当且仅当其每一个结点都与深度为深度为k 的满二叉树中编号从的满二叉树中编号从1至至n的结的结点一一对应。点一一对应。AOBCGEKDJFIHNML深度为深度为4 4的满二叉树的满二叉树深度为深度为4 4的的完全二叉树完全二叉树ABCGEIDH

    17、FJ为何要研究这两种特殊形式?为何要研究这两种特殊形式?因为它们在顺序存储方式下可以复原!因为它们在顺序存储方式下可以复原!完全二叉树的特点就是,只有最后一层完全二叉树的特点就是,只有最后一层叶子不满,且全部集中在左边。叶子不满,且全部集中在左边。这其实是这其实是的含义。在的含义。在的的“完全二叉树完全二叉树”是指是指n1=0的情况。的情况。20对于两种特殊形式的二对于两种特殊形式的二叉叉树(树(满二叉树和完全二叉树满二叉树和完全二叉树),还特别具备以下),还特别具备以下2 2个性质:个性质:2log1n 性质性质4:4:具有具有n n个结点的完全二叉树的深度必为个结点的完全二叉树的深度必为性

    18、质性质5:5:对完全二叉树,若从上至下、从左至右编号,则对完全二叉树,若从上至下、从左至右编号,则编号为编号为i 的结点,其左孩子编号必为的结点,其左孩子编号必为2i,其右孩子编号必其右孩子编号必为为2i1;其双亲的编号必为其双亲的编号必为i/2(i1 时为根时为根,除外除外)。)。证明:当证明:当i=1i=1时,由完全二叉树的定义,其左孩子是结点时,由完全二叉树的定义,其左孩子是结点2 2,右孩子是,右孩子是结点结点3 3,成立。,成立。当当i1i1时,分两种情况,此时只证最简单的一种情况,即设第时,分两种情况,此时只证最简单的一种情况,即设第j j层的第层的第一个结点的编号为一个结点的编号

    19、为i i,(,(由性质由性质2 2知,前知,前j-1j-1层共有层共有2 2j-1j-1-1-1个结点,所以个结点,所以第第j j层的第一个结点的编号为层的第一个结点的编号为2 2j-1j-1,即,即i=i=2 2j-1j-1),),则其左孩子必为第则其左孩子必为第j+1j+1层上的第一个结点,其编号为层上的第一个结点,其编号为2 2j j。(因为第因为第j j层上有层上有2 2j j-1-1个结点个结点),而,而2 2j j=2(2=2(2j-1j-1)=2i)=2i,所以,编号为所以,编号为i i的结点的左孩子的编号为的结点的左孩子的编号为2i2i。证明:根据性质证明:根据性质2 2,深度

    20、为,深度为k k的二叉树最多只有的二叉树最多只有2 2k k-1-1个结点,且完全二叉树个结点,且完全二叉树的定义是与同深度的满二叉树前面编号相同,即它的总结点数的定义是与同深度的满二叉树前面编号相同,即它的总结点数n n位于位于k k层和层和k-1k-1层满二叉树容量之间,即层满二叉树容量之间,即 2 2k-1k-1-1n2-1n2k k-1 -1 或或2 2k-1k-1n n 2 2k k三边同时取对数,于是有:三边同时取对数,于是有:k-1logk-1log2 2nk n1)f=n*fact(n-1);else f=1;return(f);33先序遍历算法先序遍历算法DLR(liuyu*

    21、root)if(root!=NULL)/非空二叉树非空二叉树 printf(“%d”,root-data);/访访问问D DDLR(root-lchild);/递归遍历左子树递归遍历左子树DLR(root-rchild);/递归遍历右子递归遍历右子树树 return(0);中序遍历算法中序遍历算法LDR(x*root)if(root!=NULL)LDR(root-lchild);printf(“%d”,root-data);LDR(root-rchild);return(0);后序遍历算法后序遍历算法LRD(x*root)if(root!=NULL)LRD(root-lchild);LRD(r

    22、oot-rchild);printf(“%d”,root-data);return(0);结点数据类型自定义结点数据类型自定义typedef struct liuyuint data;struct liuyu*lchild,*rchild;liuyu;liuyu*root;34对遍历的分析:对遍历的分析:1.从前面的三种遍历算法可以知道:如果将从前面的三种遍历算法可以知道:如果将print语句抹去,语句抹去,从递归的角度看,这三种算法是完全相同的,或者说这三种从递归的角度看,这三种算法是完全相同的,或者说这三种遍历算法的遍历算法的访问路径是相同的,只是访问结点的时机不同访问路径是相同的,只是访

    23、问结点的时机不同。从虚线的出发点到终点的路径从虚线的出发点到终点的路径上,每个结点经过上,每个结点经过3次次。AFEDCBG第第1次经过时访问先序遍历次经过时访问先序遍历第第2次经过时访问中序遍历次经过时访问中序遍历第第3次经过时访问后序遍历次经过时访问后序遍历2.2.二叉树遍历的时间效率和空间效率二叉树遍历的时间效率和空间效率时间效率时间效率:/每个结点只访问一次每个结点只访问一次空间效率空间效率:/栈占用的最大辅助空间栈占用的最大辅助空间(精确值:树深为(精确值:树深为k k的递归遍历需要的递归遍历需要k+1k+1个辅助单元!)个辅助单元!)35例:例:编写递归算法,计算二叉树中叶子结点的

    24、数目。编写递归算法,计算二叉树中叶子结点的数目。思路:思路:输出叶子结点比较简单,用任何一种遍历算法,凡输出叶子结点比较简单,用任何一种遍历算法,凡是左右指针均空者,则为叶子,将其统计并打印出来。是左右指针均空者,则为叶子,将其统计并打印出来。DLR(liuyu*root)/采用中序遍历的递归算法采用中序遍历的递归算法 if(root!=NULL)/非空非空二叉树条件,还可写成二叉树条件,还可写成if(root)if(root)if(!root-lchild&!root-rchild)/是叶子结点则统计并打印是叶子结点则统计并打印 sum+;printf(%dn,root-data);DLR(

    25、root-lchild);/递归遍历左子树,直到叶子处;递归遍历左子树,直到叶子处;DLR(root-rchild);/递归遍历右子树,直到叶子处;递归遍历右子树,直到叶子处;return(0);36注:要实现遍历运算必须先把二叉树存入机内。注:要实现遍历运算必须先把二叉树存入机内。思路:思路:利用利用前序前序遍历来建树遍历来建树(结点值陆续从键盘输入,用(结点值陆续从键盘输入,用DLR为宜为宜)Bintree createBTpre()Bintree T;char ch;scanf(“%c”,&ch);if(ch=)T=NULL;elseT=(Bintree)malloc(sizeof(Bi

    26、nTNode);T-data=ch;T-lchild=createBTpre();T-rchild=createBTpre();return T;怎样建树?见教材怎样建树?见教材P131P131程序。程序。37习题讨论:习题讨论:算法思路:算法思路:只查各结点后继链表指针,若左只查各结点后继链表指针,若左(右右)孩子的左孩子的左(右右)指针非空,则层次数加指针非空,则层次数加1 1;否则函数返回。;否则函数返回。左左子子树树右右子子树树根根hlhlhrhrHeight=max(hr,hr)+1Height=max(hr,hr)+1AFEDCBG38后序遍历求二叉树的高度递归算法:后序遍历求二叉

    27、树的高度递归算法:IntInt PostTreeDepth(BiTreePostTreeDepth(BiTree btbt)intint hl,hr,max;hl,hr,max;if(btif(bt!=NULL)!=NULL)hl=hl=PostTreeDepthPostTreeDepth(btbt-LchildLchild);/);/求左子树的深度求左子树的深度 hr=hr=PostTreeDepth(btPostTreeDepth(bt-RchildRchild);/);/求右子树的深度求右子树的深度 max=hlhr?hl:hr;/max=hlhr?hl:hr;/*得到左、右子树深度较大

    28、者得到左、右子树深度较大者*/return(max+1);/return(max+1);/*返回树的深度返回树的深度*/else return 0;else return 0;39 算法思路:算法思路:既然要求从上到下,从左到右,则既然要求从上到下,从左到右,则利用队列利用队列存放各存放各子树结点的指针是个好办法,而不必拘泥于递归算法。子树结点的指针是个好办法,而不必拘泥于递归算法。技巧:技巧:当根结点入队后,令其左、右孩子结点入队,而左孩子当根结点入队后,令其左、右孩子结点入队,而左孩子出队时又令它的左右孩子结点入队,出队时又令它的左右孩子结点入队,由此便可产生按层次由此便可产生按层次输出的

    29、效果。输出的效果。ADFCGEHBVoid Void Layout(BiTreeLayout(BiTree root)root)EnQueue(s,rootEnQueue(s,root););While(!QueueEmpty(sWhile(!QueueEmpty(s)DeQueue(s,pDeQueue(s,p););printf(“%c”,rootprintf(“%c”,root-data);data);EnQueue(s,pEnQueue(s,p-lchildlchild););EnQueue(s,pEnQueue(s,p-rchildrchild););40算法思路:算法思路:若不用递

    30、归,则要实现二叉树遍历的若不用递归,则要实现二叉树遍历的“嵌套嵌套”规规则,必用堆栈。可直接用则,必用堆栈。可直接用whilewhile语句和语句和push/poppush/pop操作。操作。参见教材参见教材P130-131P130-131程序。程序。在中序遍历中,我们是通过顺着左子树的在中序遍历中,我们是通过顺着左子树的根直走到最左端,然后访问最左端元素,根直走到最左端,然后访问最左端元素,遍历右,再返回上一层,访问结点,遍历遍历右,再返回上一层,访问结点,遍历右,然后再访问上一层,这样又顺着左子右,然后再访问上一层,这样又顺着左子树的根回到树的根回到A A。在递归调用中,返回上一层的操作是

    31、通过在递归调用中,返回上一层的操作是通过调用函数执行结束自然返回上一层的。如调用函数执行结束自然返回上一层的。如果不用递归,如何返回上一层。果不用递归,如何返回上一层。先从先从A A走到走到F F,在从在从F F返回到返回到A A,最后走到的最后走到的先访问,所以可以用栈。先访问,所以可以用栈。把把根和根和左子树的根全部入栈左子树的根全部入栈然后判断是否有右子树,如果有,则遍历然后判断是否有右子树,如果有,则遍历右子树,右子树,HIAFEDCBG41证明:由一棵二叉树的先序序列和中序序列可唯一确定这棵证明:由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树。二叉树。例:例:已知一棵二叉树的已

    32、知一棵二叉树的中序序列中序序列和和后序序列后序序列分别是分别是BDCEAFHG 和和 DECBHGFA,请画出这棵二叉树。请画出这棵二叉树。分析:分析:由后序遍历特征,根结点必在后序序列尾部由后序遍历特征,根结点必在后序序列尾部(即(即A A);由中序遍历特征,根结点必在其中间,而且其左部必全部是由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树子孙左子树子孙(即(即BDCEBDCE),其右部必全部是右子树子孙其右部必全部是右子树子孙(即(即FHGFHG);继而,根据后序中的继而,根据后序中的DECBDECB子树可确定子树可确定B B为为A A的左孩子,根据的左孩子,根据HGFHGF子

    33、串可确定子串可确定F F为为A A的右孩子;以此类推。的右孩子;以此类推。42中序遍历:中序遍历:B D C E A F H G后序遍历:后序遍历:D E C B H G F A(B D C E)(F H G)ABF (D C E)(H G)CD EGHABBFF436.4 树和森林1.树和森林与二叉树的转换树和森林与二叉树的转换2.树和森林的存储方式树和森林的存储方式3.树和森林的遍历树和森林的遍历441234587961845 利用除根结点外每个结点只有唯一的双利用除根结点外每个结点只有唯一的双亲的性质,以一组连续的空间存储树的结点,亲的性质,以一组连续的空间存储树的结点,同时在每个结点中

    34、附设一个指示域指示其双同时在每个结点中附设一个指示域指示其双亲结点在存储空间中的位置。亲结点在存储空间中的位置。6.4 树的存储结构树的存储结构一、一、双亲表示法双亲表示法#define MAX_TREE_SIZE 100#define MAX_TREE_SIZE 100结点结构:结点结构:Typedef struct PTNode Elem data;int parent;PTNode;Data parentData parentTypedef struct PTNode nodesMAX_TRee_size;int r,n;466.4 树的存储结构树的存储结构E ED DA AB BR R

    35、C CF FG GH Hk k6H6G3F1E1D0C0B0A-1RK60 01 12 23 34 45 56 67 78 89 9R=0R=0N=10N=1047特点:特点:1 1)求结点的双亲操作可以在常量时间内实)求结点的双亲操作可以在常量时间内实现;现;2 2)求结点的孩子时需要遍历整个向量。)求结点的孩子时需要遍历整个向量。48二、孩子表示法二、孩子表示法孩子结点:孩子结点:Typedef struct CTNode int child;struct CTNode*next;*childPtr;双亲结点双亲结点:Typedef struct Elem data;childPtr fi

    36、rstchild;CTBox;49树结构:树结构:TypedefTypedef structstruct CTBoxCTBox nodesMAX_TREE_SIZE;nodesMAX_TREE_SIZE;intint n,r;n,r;CtreeCtree;50F FE EB BC CA AD DG GR=0R=0N=7N=70 01 12 23 34 45 56 6A AB BC CD DE EF FG G1 12 23 34 45 56 6-1-10 00 00 02 22 25 551三、树的二叉链表三、树的二叉链表 (孩子(孩子-兄弟)存储表示法兄弟)存储表示法 typedeftyped

    37、ef structstruct CSNodeCSNode ElemElem data;data;structstruct CSNodeCSNode *firstchildfirstchild,*nextsiblingnextsibling;CSNodeCSNode,*CSTreeCSTree;52F FE EB BC CA AD DG GA AB BC CE ED DF FG GA AB BC CE ED DF FG G531.树和森林与二叉树的转换树和森林与二叉树的转换转换步骤:转换步骤:step1:step1:将树中同一结点的兄弟相连将树中同一结点的兄弟相连;step2:step2:保留结

    38、点的最左孩子连线,删除其它孩保留结点的最左孩子连线,删除其它孩子连线;子连线;step3:step3:将同一孩子的连线绕左孩子旋转将同一孩子的连线绕左孩子旋转4545度角。度角。加线加线抹线抹线旋转旋转讨论讨论1 1:树如何转为二叉树?:树如何转为二叉树?54方法:方法:加加线线抹线抹线旋转旋转 abeidfhgc树转二叉树举树转二叉树举例例:abeidfhgc兄弟相连兄弟相连长兄为父长兄为父孩子靠左孩子靠左55讨论讨论2 2:二叉树怎样还原为树?:二叉树怎样还原为树?abeidfhgc要点:把所有右孩子变为兄弟!要点:把所有右孩子变为兄弟!abeidfhgc56法一:法一:各森林先各自转为二

    39、叉树;各森林先各自转为二叉树;依次连到前一个二叉树的右子树上。依次连到前一个二叉树的右子树上。讨论讨论3 3:森林如何转为二叉树?:森林如何转为二叉树?法二:法二:森林直接变兄弟,再转为二叉树森林直接变兄弟,再转为二叉树(参见教材(参见教材P138P138图图6.176.17,两种方法都有转换示意图),两种方法都有转换示意图)即即F=TF=T1 1,T,T2 2,T,Tm m B=root,LB,RB B=root,LB,RB57ABCDEFGHJIABCDEFGHJIBCDEFGHJI森林转二叉树举例:森林转二叉树举例:(法二)(法二)兄弟相连兄弟相连 长兄为父长兄为父孩子靠左孩子靠左 头根

    40、为根头根为根 58讨论讨论4 4:二叉树如何还原为森林?:二叉树如何还原为森林?要点:要点:把最右边的子树变为森林,其余右子树变为兄弟把最右边的子树变为森林,其余右子树变为兄弟 ABCDEFGHJIABCDEFGHJIEFABCDGHJI即即B=root,LB,RB F=TB=root,LB,RB F=T1 1,T,T2 2,T,Tm m 59树的遍历可有三条搜索路径:树的遍历可有三条搜索路径:先根序(次序)遍历先根序(次序)遍历 若树不空,则先访问根结点,然后依次先根遍若树不空,则先访问根结点,然后依次先根遍历各棵子树。历各棵子树。后根(次序)遍历后根(次序)遍历 若树不空,则先依次后根遍历

    41、各棵子树,然后若树不空,则先依次后根遍历各棵子树,然后访问根结点。访问根结点。按层次遍历按层次遍历 若树不空,则自上而下自左至右访问树中每个若树不空,则自上而下自左至右访问树中每个结点。结点。60C CF FE EB BA AD DG GH HI IJ JK K先根遍历时顶点的访问先根遍历时顶点的访问次序:次序:A B E F C D G H I J KA B E F C D G H I J K后根遍历时顶点的访问后根遍历时顶点的访问次序:次序:E F B C I J K H G D AE F B C I J K H G D A层序遍历时顶点的访问层序遍历时顶点的访问次序:次序:A B C D

    42、 E F G H I J KA B C D E F G H I J K61 先序遍历先序遍历若森林为空,返回;若森林为空,返回;访问森林中第一棵树的根结点;访问森林中第一棵树的根结点;先序遍历第一棵树中根结点的子树森林;先序遍历第一棵树中根结点的子树森林;先序遍历除去第一棵树之后剩余的树构成的森林。先序遍历除去第一棵树之后剩余的树构成的森林。中序遍历中序遍历若森林为空,返回;若森林为空,返回;中序遍历森林中第一棵树的根结点的子树森林;中序遍历森林中第一棵树的根结点的子树森林;访问第一棵树的根结点;访问第一棵树的根结点;中序遍历除去第一棵树之后剩余的树构成的森林。中序遍历除去第一棵树之后剩余的树

    43、构成的森林。森林的遍历森林的遍历ABCDEFGHJI62ABCDEFGHKIABCDEFGLJ63路路 径径:路径长度路径长度:树的路径长度树的路径长度:带权路径长度带权路径长度:树的带权路径长度树的带权路径长度:霍霍 夫夫 曼曼 树树:6.5 Huffman6.5 Huffman树及其应用树及其应用一、最优二叉树(一、最优二叉树(霍夫曼霍夫曼树)树)由一结点到另一结点间的分支所构成由一结点到另一结点间的分支所构成路径上的分支数目路径上的分支数目从树根到从树根到每一结点每一结点的路径长度之和。的路径长度之和。结点到根的路径长度与结点上权的乘积结点到根的路径长度与结点上权的乘积预备知识:若干术语

    44、预备知识:若干术语debacf g树中所有树中所有叶子结点叶子结点的带权路径长度之和的带权路径长度之和带权路径长度最小的树。带权路径长度最小的树。aeae的路径长度的路径长度树长度树长度2 2101064HuffmanHuffman树简介:树简介:树的带权路径长度如何计算?树的带权路径长度如何计算?WPLWPL=w wk kl lk k k=1k=1n nabdc7524(a)cdab2457(b)bdac7524(c)WPL=36WPL=46WPL=35哈夫曼树则是:哈夫曼树则是:WPL WPL 最小的树。最小的树。Huffman树树Weighted Path LengthWeighted

    45、Path Length65构造霍夫曼树的基本思想:构造霍夫曼树的基本思想:构造构造HuffmanHuffman树的步骤(即树的步骤(即HuffmanHuffman算法):算法):66操作要点:操作要点:对权值的合并、删除与替换对权值的合并、删除与替换在权值集合在权值集合7,5,2,47,5,2,4中,总是合并中,总是合并当前值最小当前值最小的两个权的两个权构造构造HuffmanHuffman树的步骤:树的步骤:注:方框表示外结点(叶子,字符对应的权值注:方框表示外结点(叶子,字符对应的权值),),圆框表示内结点(合并后的权值)。圆框表示内结点(合并后的权值)。6.2.2 6.2.2 赫夫曼编码

    46、赫夫曼编码67设有设有4 4个字符个字符d,i,a,nd,i,a,n,出现的频度分别为出现的频度分别为7,5,2,7,5,2,4 4,怎样编码才能使它们组成的报文在网络中传得最快?,怎样编码才能使它们组成的报文在网络中传得最快?法法1 1:等长编码等长编码。例如用二进制编码来实现。例如用二进制编码来实现。取取 d=d=0000,i=i=0101,a=a=1010,n=n=1111法法2 2:不等长编码不等长编码,例如用前缀编码来实现。,例如用前缀编码来实现。取取 d=d=0 0;i=;i=1010,a=,a=110110,n=,n=111111adin000111用用二二叉叉树树来来设设计计前

    47、前缀缀编编码码最快的编码是哪个?最快的编码是哪个?是非等长的前缀编码!是非等长的前缀编码!任一个字符的编任一个字符的编码都不是另一个码都不是另一个字符编码的前缀字符编码的前缀约定:约定:左分支表示左分支表示0 0右分支表示右分支表示1 1则从根结点到叶子结点的则从根结点到叶子结点的路径上分支字符组成的字路径上分支字符组成的字符串作为该叶子的编码。符串作为该叶子的编码。68A AC CB BD DE EK KF FG GH HI IJ J69如何得到如何得到电文长度电文长度最短的二进制前缀编码?最短的二进制前缀编码?若按各个字符出现的概率不同而给予不等长编码,可望减若按各个字符出现的概率不同而给

    48、予不等长编码,可望减少总编码长度。少总编码长度。d,i,a,nd,i,a,n,出现的频度分别为出现的频度分别为7,5,2,47,5,2,4 假设每种字符在电文中出现的次数为假设每种字符在电文中出现的次数为w wi i,,其编码长度为其编码长度为L Li i,电文中只有电文中只有n n种字符,则电文总长度为种字符,则电文总长度为=niiLiW1=niiLiW1 由此可见,设计电文总长最短的二进制前缀编码即为以由此可见,设计电文总长最短的二进制前缀编码即为以n n种字符出现的频率作权,设计一颗赫夫曼树的问题,由此得到种字符出现的频率作权,设计一颗赫夫曼树的问题,由此得到的二进制前缀编码便称为赫夫曼

    49、编码。的二进制前缀编码便称为赫夫曼编码。对应到二叉树上,若置对应到二叉树上,若置wiwi为叶子结点的权,为叶子结点的权,LiLi恰为从根恰为从根到叶子的路径长度。则:到叶子的路径长度。则:恰为二叉树上带权路径长度。恰为二叉树上带权路径长度。70操作要点:操作要点:按左按左0 0右右1 1对对HuffmanHuffman树的所有分支编号!树的所有分支编号!d da ai in n1 11 11 10 00 00 0HuffmanHuffman编码结果:编码结果:d=d=0 0,i=,i=1010,a=,a=110110,n=,n=111111WPL=1bitWPL=1bit7 72bit2bit

    50、5+3bit(2+4)=5+3bit(2+4)=3535特点:每一码都不是另一码的前缀,绝不会错译特点:每一码都不是另一码的前缀,绝不会错译!称为前缀码称为前缀码HuffmanHuffman树树 与与 HuffmanHuffman编码编码 挂钩挂钩71例例2 2(严题集(严题集6.266.26):假设用于通信的电文仅由假设用于通信的电文仅由8 8个字母个字母 a,a,b,c,d,e,f,g,hb,c,d,e,f,g,h 构成,它们在电文中出现的概率分别构成,它们在电文中出现的概率分别为为 0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10 0.07,0.19,0.0

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:数据结构课件第六章.ppt
    链接地址:https://www.163wenku.com/p-4106216.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库