沈俊 第6章 树和森林.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
沈俊 第6章 树和森林.ppt

第六章 树和森林 上海大学计算机学院 沈 俊 树的概念 例如:对于一段电文:AADDBCAAABDDCADAAADDCDDBAACCA。其字符集合为:{A、B、C、D},各个字符出现的频率(次数)是 W={12、3、5、9}。若给每个字符以等长编码:A(00)、B(10)、C(01)、D(11)。则电文代码的长度为:(12+3+5+9)*2=58。 若按各个字符出现的频率不同而给予不等长编码,可望减少电文代码的长度。因各字符出现的频率为{12/29、3/29、5/29、9/29},化成整数为{12、3、5、9},以它们为各叶结点上的权值,建立哈夫曼树,如图6-23所示,得哈夫曼编码为:A(0)、B(100)、C(101)、D(11)。它的总代码长度:12*1+(3+5)*2+9*3=54,正好等于哈夫曼树的带权路径长度WPL,显然比等长编码的代码长度要短。哈夫曼编码是一种前缀编码,解码时不会混淆。 3.构造哈夫曼树和哈夫曼编码的算法 哈夫曼树的类定义: const int MaxSize=20 //设定字符数目的最大值 template class Type class HuaffmanTree; template class Type class HuaffmanTreeNode { friend class HuaffmanTree; private: Type data; //数据元素 HuaffmanTreeNode Type *leftChild, *rightChild, *parent; //指向左右孩子及双亲的指针 }; 中序线索二叉树 : 下面以中序线索二义树为例,讨论线索二叉树的建立、线索二叉树的遍历以及在线索二叉树中查找前驱结点、查找后继结点、插入结点和删除结点等操作的实现算法。 1.建立中序线索二叉树 建立线索二叉树,或者说对二叉树线索化,实质上就是遍历一棵二叉树。在遍历的过程中检查当前结点的左、右指针域是否为空。如果为空,将它们改为指向前驱结点或后继结点的线索。另外,在对一棵二叉树加线索时,必须首先申请一个头结点,并使头结点的leftchild指向二叉树的根结点。对二叉树线索化后,还须建立最后一个结点到头结点的线索;并使头结点的rightchild指向第一个结点。 template class Type void ThreadBinTreeType :: InThread ( ThreadBinTreeNodeType *r, ThreadBinTreeNodeType *pre ) { //利用中序遍历线索化以r为根的二叉树,pre为中序序历中第一个结点的前驱 if ( r != NULL ) { InThread ( r→GetLeftChild( ), pre ); //中序线索化r的左子树 if ( r→GetLeftChild( ) == NULL ) { r→SetLeftChild( pre ); r→leftTag = 1; } //建立前驱线索 if ( pre→GetRightChild( ) == NULL ) { pre→SetRightChild( r ); pre→rightTag = 1; } //建立后继线索 pre = r; InThread ( r→GetRightChild( ), pre ); //中序线索化r的右子树 } } template class Type void ThreadBinTreeType:: CreateInThread ( ) { //建立中序线索二叉树 ThreadBinTreeNodeType *pre; root = new ThreadBinTreeNodeType; //建立头结点 root→leftTag= 1; root→rightTag = 1; if ( this == NULL ) { root→SetLeftChild( root ); root→SetRightChild( root );} //二叉树为空树 else { current = = this; root→SetLeftChild( this ); root→leftThread = 0; pre = root; InThread ( current, pre ); //中序线索化 pre→SetRightChild( root ); //最后一个结

文档评论(0)

好文精选 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档