[经济学]第6章 树和二叉树.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[经济学]第6章 树和二叉树

树的基本术语 本章学习重点  1. 熟练掌握二叉树的结构特性,了解相应的证明方法熟悉二叉树的各种存储结构的特点及适用范围。 2. 遍历二叉树是二叉树各种操作的基础。实现二叉树遍历的具体算法与所采用的存储结构有关。掌握各种遍历策略的递归算法,灵活运用遍历算法实现二叉树的其它操作。层次遍历是按另一种搜索策略进行的遍历。 4. 理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系,熟练掌握二叉树的线索化过程。 5. 熟悉树的各种存储结构及其特点,掌握树和森林与二叉树的转换方法。建立存储结构是进行其它操作的前提,因此读者应掌握 1 至 2 种建立二叉树和树的存储结构的方法。 6. 学会编写实现树的各种操作的算法。 7. 了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。 练习题 什么是满树?什么是完全二叉树? 设高为h的完全二叉树中,最多有多少结点?最少有多少结点? 给出图中二叉树的先序、中序、后序和层序遍历序列。 编写算法实现: 求二叉树中叶子结点的数目 求二叉树中以值为x的结点为根的子树深度 层序遍历二叉树 构造一棵哈夫曼树(将概率作为节点的权值) 7, 19,2,6,32,3,21,10 实习安排 参考实习指导书 使用变长编码虽然可以使得程序的总位数达到最小,但机器却无法解码。如对编码串0010110该怎样识别呢?因此,若要设计变长的编码,则这种编码必须满足这样一个条件:任意一个编码不能成为其它任意编码的前缀。我们把满足这个条件的编码叫做前缀编码。 利用哈夫曼算法,我们可以设计出最优的前缀编码。见P148图6.26。 按规定:0左1右,则有 000 001 01 10 11 2 3 5 7 8 c s e a t 所以state的编码为00111101101 stat的编码为001111011。 构造满足哈夫曼编码的最短最优性质: (1)若di≠dj(字母不同),则对应的树叶不同。因此前缀码(任一字符的编码都不是另一个字符编码 )不同,一个路径不可能是其他路径的一部分,所以字母之间可以完全区别。 (2)将所有字符变成二进制的哈夫曼编码,使带权路径长度最短,相当总的通路长度最短。 6.5.3 哈夫曼编码算法的实现 由于哈夫曼树中没有度为1的结点,则一棵有n个叶子的哈夫曼树共有2×n-1个结点,可用一个大小为2×n-1的一维数组来存放各个结点。 因为每个结点同时还包含其双亲信息和孩子结点信息,所以构成一个静态三叉链表。 静态三叉链表的描述如下: typedef struct { unsigned int weight ; /* 用来存放各个结点的权值*/ unsigned int parent, LChild, RChild ; /*指向双亲、孩子结点的指针*/ }HTNode, * HuffmanTree; /*动态分配数组,存储哈夫曼树*/ typedef char * *HuffmanCode ; /*动态分配数组,存储哈夫曼编码*/ 创建哈夫曼树并求哈夫曼编码的算法 见p147的算法6.12 数组ht的前n个分量表示叶子结点,最后一个分量表示根结点。每个叶子结点对应的编码长度不等,但最长不超过n。 A H G F E D C B 3. 在线索二叉树中找前驱、后继结点 1)找结点的中序前驱结点 根据线索二叉树的基本概念和存储结构可知,对于结点p,当p-Ltag=1时,p-LChild指向p的前驱。 当p-Ltag=0时,p-LChild指向p的左孩子。由中序遍历的规律可知,作为根p的前驱结点,它是中序遍历p的左子树时访问的最后一个结点,即左子树的“最右下端”结点。其查找算法如下: 在中序线索树中找结点前驱算法: void InPre(BiTNode * p, BiTNode * pre) /* 在中序线索二叉树中查找p的中序前驱, 并用pre指针返回结果 */ { if(p-Ltag==1) pre= p-LChild; /*直接利用线索*/ else { /* 在p的左子树中查找“最右下端”结点 */ for(q= p-LChild;q-Rtag==0;q=q-RChild); pre=q; } } 2)在中序线索树中找结点后继 对于结点p,若要找其后继结点,当p-Rtag=1时,p-RChild即为p的后继结点;当p-Rtag=0时,说明p有右子树,此时p的中序后继结点即为其右子树的“最左下端”的结点。其查找算法如下: void

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档