基于编码二叉树生成算法.docVIP

  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文档。上传文档
查看更多
基于编码二叉树生成算法

基于编码二叉树生成算法   [摘要]首先介绍二叉树的编码情况,然后提出基于编码生成的二叉树算法,介绍它的算法思路、给出算法的具体步骤描述。   [关键词]编码 二叉树 堆   中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0810037-01      二叉树是计算机数据结构与算法分析中重要的非线性数据结构之一,被广泛应用于优先级队列、分支决策、分类学、计算机语言、组合优化、形式文法、图像处理等众多领域。借助于一定的编码方法,我们就可以得到一棵二叉树对应的编码,这样的编码称作“有效的(Feasible)”编码。      一、基于编码的二叉树算法      在堆的生成过程中,对于第k层上的可能符合条件的2k-1个节点值会进行判断和回溯。当k的值不断增大时,2k-1的值也更快地增大,导致第k层上的判断时间也迅速增加。在单个数判断法与层次判断法的基础上,采用子树生成算法可以有效的减少由k的增大带来的枚举生成所有堆所花费的时间。在算法中用到的一维数组:(注:以下所用的除号V/M均为除后取整,如:3/2=1),算法思想如下:   1.数组t,t_left,t_right。组成堆的n个数按从大到小的顺序放在一维数组t中;符合组成左子树条件的n_left个数按从大到小的顺序放在一维数组t_left中;组成右子树的n_right个数按从大到小的顺序放在一维数组t_right中。n_left和n_right的内容是随着左右子树根节点的变化而动态变化的。   2.数组po,po_left,po_right,po_mid。数组po用来表示在生成一个堆的过程中数组t中的某个数是否已经被选择。如po[f]=0。,则说明数组t中t[f]这个元素尚未被选中;如果数组t中的元素t[f]已被选中,则将t[f]这个元素放在堆中的位置,即在堆中所处的节点在顺序存储结构数组t中的编号放在po[f]中。同样,po_left,po_right分别表示在生成左右子树过程中t left,t right中的某个数是否已经被选择;po_mid用来在左子树生成完成之后,将po和po_left的结果合并,表示在右子树生成之前,哪些数字已经被选中。   3.数组nch,nch_left,nch_right。因为堆是完全二叉树,已知组成堆的节点数目n,则堆的形状是不变的。堆中编号为d的节点的左右子树中的孩子节点总数是固定的,将此总数值放在nch[d]中。同理,左子树中每个节点的左右子树的孩子总数放在数组nch_left中:右子树中每个节点的左右子树的孩子总数放在数组nch_right中。   4.数组left。将所有可能作为左子树根节点的节点值按照从大到小的顺序存放在一维数组left中。   除了全局的4个一维数组,本算法还用到下面的栈:   s_left,s_right:堆是一种二叉树,此算法将左右子树在生成过程中每个节点的值分别存储在一维数组s_left和s_right中,同时s_left,s right又是顺序栈,j_left,j_right分别为栈顶指针。   栈st_left,st right:栈st_left的栈顶指针为top_left,其每个节点有两个字段,v和ind.v为数组t中某个元素的值,ind为该元素在数组t中的下标。根据上面的叙述,我们知道:如果po_left[st_left[top_left].   ind]=0,则表示v所在的这个元素在生成左子树的过程中尚未被选中;否则,表示这个元素在左子树中所处节点的编号值。同样,栈st_right表示右子树生成过程中v所在节点是否已被选中,和选中的编号值。top_left和top_right为st_left和st_rightd的栈顶指针。      二、子树算法描述      其中,n为组成整个堆元素的总个数,n_left为左子树的元素总个数,n_right为右子树的元素总个数,则n=n_left+n_right+1;k_left是在生成左子树的过程中的当前最大层数,左子树的根的层数规定为1;k-right是在生成右子树的过程中的当前最大层数,右子树的根的层数规定为1。   1.置初值,把数组t中的数按从大到小排序,并且将数组t中第一个元素作为整个堆的根节点,即po[1]=1。根据单个数判断法的条件,从数组t中除去根节点外的元素中寻找出所有可以作为左子树根节点的元素,按从大到小的顺序放入数组left中,元素个数放在left[0]中;用h作为数组left的指针,h=1。   2.从数组left中选出当前的元素作为左子树的根节点,s_left[1]=   left[h];如果hleft[0],则结束算法。   3.从数组t中,找出所有值小于或者等

文档评论(0)

erterye + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档