收藏 分享(赏)

计算机软件技术基础第4章4-5.ppt

上传人:dzzj200808 文档编号:3362253 上传时间:2018-10-18 格式:PPT 页数:23 大小:547KB
下载 相关 举报
计算机软件技术基础第4章4-5.ppt_第1页
第1页 / 共23页
计算机软件技术基础第4章4-5.ppt_第2页
第2页 / 共23页
计算机软件技术基础第4章4-5.ppt_第3页
第3页 / 共23页
计算机软件技术基础第4章4-5.ppt_第4页
第4页 / 共23页
计算机软件技术基础第4章4-5.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、4.4 二叉树的遍历 遍历二叉树定义按照一定的规律走遍该二叉树结构中的所有结点,并对每个结点访问且访问一次。按照访问结点的先后顺序(输出结点值),便可得到二叉树结点的线性序列。一棵非空的二叉树由三部分组成:根结点、左子树和右子树。若分别以D、L、R 分别表示访问根结点,遍历左子树和遍历右子树,则有六种遍历次序:DLR、LDR、LRD、DRL、RDL、RLD。 通常限定自左至右,因此只讲三种。,4.4.1 前序遍历的递归定义和程序实现 前序遍历(DLR) 又称先序遍历、先根遍历,它的递归定义是:若二叉树为空,则返回;否则,依次执行以下操作:1访问根结点;2按先根次序遍历左子树;3按先根次序遍历右

2、子树;4结束前序遍历。,具体程序实现: void PREORDER(t) bitree *t; if(t) /判断是否为空的二叉树,空的二叉树不能进行遍历printf(“%c “,t-data); /访问根结点PREORDER(t-lchild); /访问左子树PREORDER(t-rchild); /访问右子树 ,4.4.2 中序遍历的递归定义和程序实现中序遍历(LDR) 又称中根遍历,它的递归定义是:若二叉树为空,则返回;否则,依次执行以下操作:1按中根次序遍历左子树; 2访问根结点;3按中根次序遍历右子树;4结束中序遍历。,具体程序实现: void INORDER(t) bitree *

3、t; if(t) INORDER(t-lchild); /访问左子树printf(“%c “,t-data); /访问根结点INORDER(t-rchild); /访问右子树 ,4.4.3 后序遍历的递归定义和程序实现后序遍历(LRD) 又称后根遍历,它的递归定义是:若二叉树为空,则返回;否则,依次执行以下操作:1按后根次序遍历左子树; 2按后根次序遍历右子树;3访问根结点;4结束后序遍历。,具体程序实现: void POSTORDER(t) bitree * t; if(t) POSTORDER(t-lchild); /访问左子树POSTORDER(t-rchild); /访问右子树prin

4、tf(“%c “,t-data); /访问根结点 ,例:如图所示二叉树,三种遍历分别得到的线性序列为:,A,G,E,D,H,C,B,F,前序遍历:ABDEGHCF 中序遍历:DBGEHACF 后序遍历:DGHEBFCA,4.5 哈夫曼树及其应用 4.5.1 基本术语。两个结点的连线称为分支。两个结点间的分支个数称为两结点间的路径长度。从根结点到各个结点的路径长度之和称为树的路径长度。用PL表示。,AB C D E F,例: PL=0+1+1+2+2+3=9,扩充二叉树:如果一棵二叉树的所有非叶子结点都有左、右两棵子树,则称该二叉树为扩充二叉树。在扩充二叉树中,称叶子结点为外部结点,非叶子结点为

5、内部结点。对于一个含有m个外部结点的的扩充二叉树,如果其中的每一个外部结点都对应一个权值 Wk ,则该扩充二叉树的带权外部路径长度之和为:,(其中lk 为根结点到外部结点的路径长度),对于同一个外部结点集及其对应的同一组权值,可以构成若干不同的扩充二叉树。例: 给定一组权值W= 7,5,2,4,可构造多棵不同的扩充二叉树。,把带权外部路径长度之和最小的扩充二叉树称为哈夫曼树。,4.5.2 哈夫曼树的构造(即哈夫曼算法)给定一组权值,如何构造一棵哈夫曼树的算法。1.根据给定的n个权值(W1,W2,Wn),构成n棵二叉树组成的森林 F=T1,T2,Tn ,其中每棵二叉树仅含有一个权值为Ti的根结点

6、,其左、右子树为空。2.在F中选取两棵根结点的权值最小的树Ti和Tj,构造一棵新的二叉树Tk,使Ti和Tj分别为结点的左、右子树,且根结点Tk的权值为Ti和Tj的权值之和。3.在F中删去Ti和Tj两棵树,将新得到的二叉树加入F中。 4.重复、,直到F中只含有一棵树为止。 这棵树就是一棵哈夫曼树。,例:给定一组权值 W=10,20,30,40,50,10,20,30,40,50,10,20,30,30,40,50,10,20,30,60,30,40,50,10,20,30,60,30,40,50,90,10,20,30,60,30,40,50,90,150,哈夫曼树的特点: 1)权值越大的越靠近

7、根结点。 2)由n个权值构成哈夫曼树共有2n-1个结点。 3)由n个权值构成哈夫曼树不唯一。,4.5.3 哈法曼编码利用哈夫曼树构造一种数据通信用的二进制编码。 举例说明: 要传输的电文为: CAS;CAT;SAT;AT 要传输的字符集: C,A,S,T,; 各字符出现的频率分别为:2,4,2,3,3 按各字符出现的频率作为权值构造一棵哈夫曼树每个结点左孩子分支上标码,右孩子分支上标码。则各字符的哈夫曼树及编码如下图:从跟结点到叶子结点的路径上各分支上二进制数字组成的串即为该叶子结点上对应字符的哈夫曼编码。,哈夫曼树为:,6,3,8,14,3,4,4,2,2,T ; A C S 00 01 1

8、0 110 111,1,1,1,1,哈夫曼编码:,哈夫曼编码的特点: 1.各字符编码的前缀不同。 2.使电文具有最短长度的编码。 3.各字符的二进制编码长度不等,出现频率大的其编码较短。,二叉树排序树 1.定义:二叉排序树 T,或者是一棵空树,或者是具有下列性质的二叉树:1)若T的结点的左子树非空,则左子树中的所有结点的键值均小于根结点 T 的键值(关键码)。2)若T的结点的右子树非空,则右子树中的所有 结点的键值均大于根结点 T 的键值。3)根结点T的左子树和右子树都是二叉排序树。,例:,103 182 4 13 219 158,二叉排序树的特点:按中序遍历二叉排序树,所得到的中序序列是一个

9、按键值从小到大排列的有序序列。2,3,4,8,9,10,13,15,18,21,2.二叉排序树的基本运算:1)查找在一棵给定的二叉排序树中,查找键值为k的结点的方法是:首先将k与根结点的键值比较,若 k 小于根结点的键值,则进入左子树,否则进入右子树。继续在子树中用 k 与子树根结点的键值比较,如此进行下去,直到找到键值为 k 的结点,则查找成功,返回该结点的指针;或找到某个结点的左子树或右子树均为空时,则查找失败,返回空指针。,2)插入在二叉排序树中插入一个新结点 k ,插入后的结果仍要符合二叉排序树。插入方法:(1)若二叉排序树为空,则用给定的键值构造的新结点作为根结点。(2)当二叉排序树

10、非空时,若 k 小于根结点的键值,则插入到左子树中; 否则,插入到右子树中。二叉排序树递归插入算法:将结点b插入根结点指针为t的二叉排序树中。,bitree *inserbet(bitree *t,int b)if(t=NULL)t=(bitree*)malloc(sizeof(bitree);t-data=b; t-lchild=NULL; t-rchild=NULL;else if(bdata)t-lchild=inserbet(t-lchild,b);elset-rchild=inserbet(t-rchild,b);return(t);调用插入算法可对于给定的一个键值序列构造一棵二叉排序树。,

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

当前位置:首页 > 高等教育 > 大学课件

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


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

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

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