计算机软件技术基础课件009.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机软件技术基础课件009.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 技术 基础 课件 009
- 资源描述:
-
1、v 本章中主要介绍下列内容:l 树的逻辑定义和存储结构l 二叉树的逻辑定义、存储结构l 二叉树的基本操作算法l 树和二叉树的转换l 哈夫曼树及其应用第六章 树和二叉树本章学习要求掌握:树和二叉树的性质,有关术语及基本概念。掌握:二叉树的两种存储方法,重点是链式存储。掌握:各种次序的遍历算法,能灵活运用遍历算法实现二叉树的各种运算。掌握:几种建立二叉树的方法。了解:二叉树的线索化及其实质,了解在各种线索树中查找给定结点的前趋和后继的方法。了解:树、森林与二叉树之间的转换方法。了解:树的各种存储结构及其特点;树和森林的二种次序的遍历。掌握:哈夫曼树的基本概念,最优二叉树和哈夫曼编码方法。6.1 树
2、基本概念6.2 二叉树的基本操作与存储实现6.3 二叉树的遍历6.4 线索二叉树6.5 二叉树的应用6.6 树的定义与相关术语6.7 树的基本操作与存储6.8 树、森林与二叉树的转换6.9 树和森林的遍历6.1 6.1 树的基本概念树的基本概念 1.1.树的定义树的定义 树树是一种常非线性结构树是n(n0)个结点的有限集合。若n=0,则称为空树;否则,有且仅有一个特定的结点被称为根,当n1时,其余结点被分成m(m0)个互不相交的子集T1,T2,.,Tm,每个子集又是一棵树。递归定义的递归定义的树的几种形态2.2.树的特点树的特点(1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前
3、驱结点(2)树中所有结点可以有零个或多个后继结点树结构和非树结构的示意 图3.3.树的表示方法:树的表示方法:(b)凹入表(a)树形表示ABCDEFIJGH(A(B(D)(E(I)(J)(C(G)(H)(d)嵌套括号表示法CDEIJFGHAB(c)文氏图4.4.基本术语基本术语v结点(node)表示树中的元素,包括数据项及若干指向其子树的分支v结点的度(degree)结点拥有的子树数v叶子(leaf)度为0的结点,也叫终端结点v分支结点度0的结点,也叫非终端结点v结点的层次(level)从根结点算起,根为第一层,它的孩子为第二层v树的度一棵树中最大的结点度数v树的深度(depth)树中结点的最
4、大层次v有序树、无序树 如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。v森林 是m(m0)棵互不相交的树的集合。在树结构中,结点之间的关系又可以用家族关系描述,定义如下:v孩子(child)结点子树的根称为该结点的孩子v双亲(parents)孩子结点的上层结点v兄弟(sibling)同一双亲的孩子v祖先、子孙如果有一条路径从结点M到结点N,那么M就称为N的祖先,N成为M的子孙v堂兄弟 双亲在同一层的结点互为堂兄弟。ABCDEFGHIJKLM叶子:K,L,F,G,M,I,J结点B,C,D为兄弟结点K,L为兄弟结点A的度:结点B的度:结点M的度:结点A的孩子
5、:结点B的孩子:结点I的双亲:结点L的双亲:树的度:结点A的层次:结点M的层次:树的深度:结点F,G为堂兄弟结点A是结点F,G的祖先其它术语:有序树和无序树、森林320DE4143B,C,DE,F术语ABDEFHJKLM结点A的度:2结点B的度:2结点M的度:0叶子:K,L,F,M,J结点A的孩子:B,D结点B的孩子:E,F结点J的双亲:D结点L的双亲:E结点B,D为兄弟结点K,L为兄弟树的度:2结点A的层次:1结点M的层次:4树的深度:4结点F,H为堂兄弟结点A是结点F,H的祖先5.5.树的基本运算树的基本运算常用操作常用操作:(1)构造一个树 CreateTree(T)(2)清空以T为根的
6、树 ClearTree(T)(3)判断树是否为空 TreeEmpty(T)(4)获取给定结点的第i个孩子 Child(T,node,i)(6)获取给定结点的双亲 Parent(T,node)(6)遍历树Traverse(T)对树遍历的主要目的是将非线性结构通过遍历过程线性化,即获得一个线性序列。树的遍历顺序有两种,一种是先序遍历,即先访问根结点,然后再依次用同样的方法访问每棵子树;另一种是后序遍历,即先依后序遍历方法依次访问每棵子树,最后访问根结点。6.2 6.2 二叉树二叉树6.2.1 6.2.1 二叉树的定义二叉树的定义1.1.定义定义 二叉树二叉树是n(n0)个结点的有限集合。当n=0时
7、,称为空二叉树;当n0时,有且仅有一个结点为二叉树的根,其余结点被分成两个互不相交的子集,一个作为左子集,另一个作为右子集,每个子集又是一个二叉树。二叉树二叉树是另一种树形结构。它与树形结构的区别是:(1)每个结点最多有两棵子树;(2)子树有左右之分。递归定义的递归定义的二叉树结构的图形表示示例G HD E FB CA 只有根结点的二叉树空二叉树 左子树右子树为空 右子树左子树为空 左子树右子树左、右子树均非空2.2.二叉树的二叉树的5 5种形态种形态:3.3.二叉树的基本运算二叉树的基本运算 (1)构造一棵二叉树 CreateBTree(BT)(2)清空以BT为根的二叉树 ClearBTre
8、e(BT)(3)判断二叉树是否为空 BTreeEmpty(BT)(4)获取给定结点的左孩子和右孩子 LeftChild(BT,node),RightChild(BT,node)(5)给定结点的左孩子和右孩子 LeftChild(BT,node),RightChild(BT,node)(5)获取给定结点的双亲 Parent(BT,node)(6)遍历二叉树Traverse(BT)6.2.2 二叉树性质v性质1:)1(21iii个结点层上至多有在二叉树的第 第i层上最大结点数是第i-1层的2倍,即 故命题得证12222ii证明:用归纳法证明之12201ii=1时,只有一个根结点是对的12j假设对所
9、有j(1ji)命题成立,即第j层上至多有 个结点22i那么,第i-1层至多有 个结点又二叉树每个结点的度至多为2v性质2:深度为k的二叉树至多有 个结点(k1)12 k证明:由性质1,可得深度为k 的二叉树最大结点数是122)(111kkikiii层的最大结点数第v性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1证明:n1为二叉树T中度为1的结点数 因为:二叉树中所有结点的度均小于或等于2 所以:其结点总数n=n0+n1+n2 又二叉树中,除根结点外,其余结点都只有一个 分支进入 设B为分支总数,则n=B+1 又:分支由度为1和度为2的结点射出,B=n
10、1+2n2 于是,n=B+1=n1+2n2+1=n0+n1+n2 n0=n2+1几种特殊形式的二叉树v满二叉树l定义:12个结点的二叉树称为且有一棵深度为kkl特点:每一层上的结点数都是最大结点数v完全二叉树l定义:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为l特点u叶子结点只可能在层次最大的两层上出现u对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l 或l+1ABCKDEHILFGJ123456789101112ABCKDEHILMFGJNO1234567891011131415ABCDEJK12345
11、67ABCDEG123456证明:根据完全二叉树的定义和性质2可知,当一棵完全二叉树的深度为k、结点个数为n时,有2 k-1-1n2k-12 k-1 n 2kK-1 log2n 1,则其双亲是i/2 (2)如果2in,则结点i无左孩子;如果2in,则其左孩子是2i (3)如果2i+1n,则结点i无右孩子;如果2i+1n,则其右孩子是2i+12i+2 2i 2i+1 2i+2 2i+3 i+1 2i 2i+1i i i+1 6.2.3 二叉树的存储结构 二叉树也可以采用两种存储方式:顺序存储结构和链式存储结构。1.顺序存储结构 其存储形式为:用一组连续的存储单元按照完全二叉树的每个结点编号的顺序
12、存放结点内容。l完全二叉树的存储实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素l特点:结点间关系蕴含在其存储位置中ABCKDEHILFGJ1234567891011121.顺序存储结构:用一组连续的存储单元按照完全二叉树的 每个结点编号的顺序存放结点内容。A B C D E F G H I J K L1 2 3 4 5 6 7 8 9 10 11 12 6.2.3 二叉树的存储结构 二叉树也可以采用两种存储方式:顺序存储结构和链式存储结构。l一般二叉树的顺序存储:将一般二叉树添加虚结点转为完全二叉树,然后进行存储A B C D E J K 1 2 3 4 5 6 7 8 9 10
13、11l特点:u结点间关系蕴含在其存储位置中u浪费空间,适于存满二叉树和完全二叉树ABCDEJK1234567891011在C语言中,这种存储形式的类型定义如下所示:#define MaxTreeNodeNum 100typedef struct datatype dataMaxTreeNodeNum;/*根存储在下标为1的数组单元中*/int n;/*当前完全二叉树的结点个数*/QBTree;(1)构造一棵完全二叉树void CreateBTree(QBTree*BT,DataType data,int n)if(n=MaxTreeNodeNum)n=MaxTreeNodeNum-1;for(
14、i=1;idatai=datai;BT-n=n;(2)获取给定结点的左孩子 int LeftCHild(QBTree BT,int node)if(2*nodeBT.n)return 0;else return 2*node;RightChild(BT,node)与这个操作类似,读者可试着自行完成。(3)获取给定结点的双亲 int Parent(QBTree BT,int node)if(1node&nodeBDCD L R先序遍历序列:A B D C先序遍历:先访问根结点,然后分别先序遍历左子树、右子树ADBCL D RBL D RL D RADCL D R中序遍历序列:B D A C中序遍
15、历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树ADBC L R DL R DL R DADCL R D后序遍历序列:D B C A后序遍历:先后序遍历左、右子树,然后访问根结点B-+/a*b-efcd先序遍历:中序遍历:后序遍历:-+a*b-c d/e f-+a*b-cd/ef-+a*b-c d/e f 下面我们再给出两种遍历二叉树的方法:(1)对一棵二叉树中序遍历时,若我们将二叉树严格地按左子树的所有结点位于根结点的左侧,右子树的所有结点位于根右侧的形式绘制,就可以对每个结点做一条垂线,映射到下面的水平线上,由此得到的顺序就是该二叉树的中序遍历序列。D G B A E C H F
16、G HD E FB CA 任何一棵二叉树都可以将它的外部轮廓用一条线绘制出来,我们将它称为二叉树的包线,这条包线对于理解二叉树的遍历过程很有用。G HD E FB CAv遍历算法:由此可以看出:(1)遍历操作实际上是将非线性结构线性化的过程,其结果为线性序列,并根据采用的遍历顺序分别称为先序序列、中序序列或后序序列;(2)遍历操作是一个递归的过程,因此,这三种遍历操作的算法可以用递归函数实现。l递归算法void PreOrder(BiTree bt)if(bt=NULL)return;printf(%dt,bt-data);PreOrder(bt-lchild);PreOrder(bt-rch
17、ild);主程序主程序Pre(T)返回返回pre(T R);返回返回pre(T R);ACBDTBprintf(B);pre(T L);BTAprintf(A);pre(T L);ATDprintf(D);pre(T L);DTCprintf(C);pre(T L);C返回T左是空返回pre(T R);T左是空返回T右是空返回T左是空返回T右是空返回pre(T R);先序序列:A B D C6.3.2二叉树遍历的非递归算法(1)先序遍历的非递归实现 可利用堆栈将递归算法改写成非递归的形式BiTree stackMAXNODE;X遍历左子树遍历右子树访问结点bt 非递归先序遍历二叉树的主要操作:
18、非递归先序遍历二叉树的主要操作:p=bt;while(1)while(p不空不空)visit(p-data);/进栈之前访问进栈之前访问p结点结点;push(p,stack);p=p-lchild;if(栈空栈空)return;p=pop(stack);p=p-rchild;ABCDEFGptopP-A(1)访问:AABCDEFGp访问:ABtopP-A(2)P-B访问:ABCtopP-AP-C(3)P-BtopP-A (4)P-DpABCDEFGABCDEFGp访问:ABCDwhile(p不空不空)visit(p-data);push(p,stack);p=p-lchild;p=pop(st
19、ack);p=p-rchild;ABCDEFGp访问:ABCDEtopP-AP-E(5)P-DABCDEFGp访问:ABCDEGtopP-AP-G(6)P-DABCDEFGp访问:ABCDEGFtopP-A(7)P-FABCDEFGp栈空结束top (8)p=bt;while(1)while(p不空不空)push(p,stack);p=p-lchild;if(栈空栈空)return;p=pop(stack);visit(p-data);/出栈时访问出栈时访问p结点结点;p=p-rchild;(2)中序遍历的非递归实现ABCDEFGpP-A(1)ABCDEFGpP-AP-B(2)ABCDEFGp
20、P-AP-BP-C(3)p=NULLABCDEFGP-AP-B访问:C(4)pABCDEFGP-A访问:C B(5)ABCDEFGP-AP-D访问:C Bp(6)ABCDEFGP-AP-DP-E访问:C Bp(7)ABCDEFGP-AP-D访问:C B Ep(8)ABCDEFGP-AP-DP-G访问:C B EP=NULL(9)ABCDEFGP-A访问:C B E G Dp(11)ABCDEFGP-AP-F访问:C B E G Dp(12)ABCDEFGP-AP-D访问:C B E Gp(10)ABCDEFGP-A访问:C B E G D Fp=NULL(13)ABCDEFG访问:C B E
21、G D F Ap(14)ABCDEFG访问:C B E G D F Ap=NULL(15)(3)后序遍历的非递归实现Typedef struct BiTree link;int flag=0;/进栈的次数进栈的次数 stacktype;stacktype stackMAXNODE;/顺序栈顺序栈stacktype XP;结点要入两次栈,出两次栈,在第二次出栈时访问。p=bt;while(1)while(p不空不空)XP.link=p;XP.flag=1;push(XP,stack);/第一次进栈第一次进栈 p=p-lchild;if(栈空栈空)return;XP=pop(stack);p=XP
22、.link;sign=XP.flag;if(sign=2)/第二次出栈第二次出栈 visit(p-data);p=NULL;else /第一次出栈第一次出栈 XP.link=p;XP.flag=2;push(XP,stack);/第二次进栈第二次进栈 p=p-rchild;pABCDEFGP-A 1(1)ABCDEFGpP-A 1P-B 1(2)ABCDEFGpP-A 1P-B 1P-C 1(3)while(p不空不空)XP.link=p;XP.flag=1;push(XP,stack);/第一次进栈第一次进栈 p=p-lchild;ABCDEFGP-A 1P-B 1P-C 1(4)ABCDE
23、FGP-A 1P-B 1P-C 2(5)ABCDEFGP-A 1P-B 1(6)XP=pop(stack);p=XP.link;sign=XP.flag;if(sign=2)/第二次出栈第二次出栈 visit(p-data);p=NULL;else /第一次出栈第一次出栈 XP.link=p;XP.flag=2;push(XP,stack);/第二次进栈第二次进栈 p=p-rchild;C第一次出栈C第二次进栈C第二次出栈访问CB第一次出栈第二次进栈ABCDEFGP-A 1P-B 2(7)pABCDEFGP-A 1P-B 2P-D 1P-E 1(8)pABCDEFGP-A 1P-B 2P-D
24、1P-E 2P-G 1(9)pABCDEFGP-A 1P-B 2P-D 1P-E 2(12)访问C GABCDEFGP-A 1P-B 2P-D 2P-F 1(13)访问C G EABCDEFGP-A 1P-B 2P-D 2P-F 1(14)访问C G E F D B ABCDEFGP-A 2 (15)访问C G E F D B A ABCDEFG (16)6.3.3 按层次遍历二叉树 实现方法为从上层到下层,每层中从左侧到右侧依次访问每个结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每个结点的遍历序列。G HD E FB CA按层次遍历按层次遍历该二叉树的序列为该二叉树的序列为:ABCD
25、EFGH 二叉树用顺序存储结构表示时,按层遍历的算法实二叉树用顺序存储结构表示时,按层遍历的算法实现现A 1B 3 4 C D 5 6 E F 7 8 G01234567ABCDEFG(a)完全二叉树A 1B 2 3 CD 4 E 6 7 F(b)非完全二叉树01234567A BC#D EF图 5-20void LevelOreder(QBTree BT)for(i=1;ilchild)Visite(p-lchild);EnQueue(&Q,p-lchild);/处理左孩子 if(!p-rchild)Visite(p-rchild);EnQueue(&Q,p-rchild);/处理右孩子 6
展开阅读全文