《数据结构》-第九章 查找_第1页
《数据结构》-第九章 查找_第2页
《数据结构》-第九章 查找_第3页
《数据结构》-第九章 查找_第4页
《数据结构》-第九章 查找_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章查找925INTSEARCH_SQSSTABLEST,INTKEY/在有序表上顺序查找的算法,监视哨设在高下标端STELEMSTLENGTH1KEYKEYFORI1STELEMIKEYKEYIIFISTLENGTH|STELEMIKEYHIGHRETURN0/查找不到时返回0MIDLOWHIGH/2IFSTELEMMIDKEYKEYRETURNMIDELSEIFSTELEMMIDKEYKEYRETURNSEARCH_BIN_RECURSIVEST,KEY,LOW,MID1ELSERETURNSEARCH_BIN_RECURSIVEST,KEY,MID1,HIGH/SEARCH_BIN_RECURSIVE927INTLOCATE_BINSSTABLEST,INTKEY/折半查找,返回小于或等于待查元素的最后一个结点号INTRRSTELEMIFKEYRSTLENGTHKEYRETURNSTLENGTHLOW1HIGHSTLENGTHWHILELOWRMIDKEY/超过最大元素LOW1HIGHLBLKNUMFOUND0WHILELOWLIDXMID1MAXKEYFOUND1ELSEIFKEYLIDXMIDMAXKEYLOWMID1ELSEHIGHMID1ILIDXMIDFIRSTLOC/块的下界JIBLKSIZE1/块的上界TEMPLELEMI1/保存相邻元素LELEMI1KEY/设置监视哨FORKJLELEMKKEYK/顺序查找LELEMI1TEMP/恢复元素IFKDATAKEYRETURNLTELSEIFLTDATAKEYFORPLH,I1PDATAKEYPPNEXT,IELSEFORPLT,ILTPOSPDATAKEYPPNEXT,ILTP/更新T指针RETURNP/SEARCH_CSLIST分析由于题目中假定每次查找都是成功的,所以本算法中没有关于查找失败的处理由微积分可得,在等概率情况下,平均查找长度约为N/3930TYPEDEFSTRUCTDLNODEPREINTDATADLNODENEXTDLNODETYPEDEFSTRUCTDLNODESPINTLENGTHDSLIST/供查找的双向循环链表类型DLNODESEARCH_DSLISTDSLISTIFPDATAKEYWHILEPDATAKEYPPPRELSPPELSEIFPDATADATANEXTLSPPRETURNP/SEARCH_DSLIST分析本题的平均查找长度与上一题相同,也是N/3931INTLAST0,FLAG1INTIS_BSTREEBITREET/判断二叉树T是否二叉排序树,是则返回1,否则返回0IFTLCHILDIFTDATADATAIFTRCHILDRETURNFLAG/IS_BSTREE932INTLAST0VOIDMAXLT_MINGTBITREET,INTX/找到二叉排序树T中小于X的最大元素和大于X的最小元素IFTLCHILDMAXLT_MINGTTLCHILD,X/本算法仍是借助中序遍历来实现IFLASTDATAX/找到了小于X的最大元素PRINTF“ADN“,LASTIFLASTDATAX/找到了大于X的最小元素PRINTF“BDN“,TDATALASTTDATAIFTRCHILDMAXLT_MINGTTRCHILD,X/MAXLT_MINGT933VOIDPRINT_NLTBITREET,INTX/从大到小输出二叉排序树T中所有不小于X的元素IFTRCHILDPRINT_NLTTRCHILD,XIFTDATADATAIFTLCHILDPRINT_NLTTLCHILD,X/先右后左的中序遍历/PRINT_NLT934VOIDDELETE_NLTBITREEIFTDATALCHILDFREEQ/如果树根不小于X,则删除树根,并以左子树的根作为新的树根IFTDELETE_NLTT,X/继续在左子树中执行算法/DELETE_NLT935VOIDPRINT_BETWEENBITHRTREET,INTA,INTB/打印输出后继线索二叉排序树T中所有大于A且小于B的元素PTWHILEPLTAGPPLCHILD/找到最小元素WHILEP/输出符合条件的元素IFPRTAGPPRTAGELSEPPRCHILDWHILEPLTAGPPLCHILD/转到中序后继/WHILE/PRINT_BETWEEN936VOIDBSTREE_INSERT_KEYBITHRTREEQBITHRNODEMALLOCSIZEOFBITHRNODEQDATAXTRCHILDQTRTAG0QRTAG1QRCHILDP/修改原线索ELSEBSTREE_INSERT_KEYTRCHILD,X/T有右子树时,插入右子树中/IFELSEIFTDATAX/插入到左子树中IFTLCHILD/T没有左子树时,作为左孩子插入QBITHRNODEMALLOCSIZEOFBITHRNODEQDATAXTLCHILDQQRTAG1QRCHILDT/修改自身的线索ELSEBSTREE_INSERT_KEYTLCHILD,X/T有左子树时,插入左子树中/IF/BSTREE_INSERT_KEY937STATUSBSTREE_DELETE_KEYBITHRTREE/PTR为X所在结点,PRE和SUC分别指向PTR的前驱和后继PTLASTNULL/LAST始终指向当前结点P的前一个前驱WHILEPLTAGPPLCHILD/找到中序起始元素WHILEPIFPDATAX/找到了元素X结点PRELASTPTRPELSEIFLAST/找到了X的后继IFPRTAGPPRTAGELSEPPRCHILDWHILEPLTAGPPLCHILD/转到中序后继LASTP/WHILE/借助中序遍历找到元素X及其前驱和后继结点IFPTRRETURNERROR/未找到待删结点DELETE_BSTREEPTR/删除X结点IFPRE/修改线索RETURNOK/BSTREE_DELETE_KEYVOIDDELETE_BSTREEBITHRTREEIFTLTAGELSEIFTLTAGELSEIFTLTAGRTLCHILDWHILERRTAGSRRRRCHILD/找到结点的前驱R和R的双亲STDATARDATA/用R代替T结点IFSTSRCHILDRLCHILDELSESLCHILDRLCHILD/重接R的左子树到其双亲结点上QR/ELSEFREEQ/删除结点/DELETE_BSTREE分析本算法采用了先求出X结点的前驱和后继,再删除X结点的办法,这样修改线索时会比较简单,直接让前驱的线索指向后继就行了如果试图在删除X结点的同时修改线索,则问题反而复杂化了938VOIDBSTREE_MERGEBITREEIFSRCHILDBSTREE_MERGET,SRCHILD/合并子树INSERT_KEYT,S/插入元素/BSTREE_MERGEVOIDINSERT_NODEBITREEELSEINSERT_NODETRCHILD,SELSEIFSDATADATAIFTLCHILDTLCHILDSELSEINSERT_NODETLCHILD,SSLCHILDNULL/插入的新结点必须和原来的左右子树断绝关系SRCHILDNULL/否则会导致树结构的混乱/INSERT_NODE分析这是一个与课本上不同的插入算法在合并过程中,并不释放或新建任何结点,而是采取修改指针的方式来完成合并这样,就必须按照后序序列把一棵树中的元素逐个连接到另一棵树上,否则将会导致树的结构的混乱939VOIDBSTREE_SPLITBITREEIFTRCHILDBSTREE_SPLITTRCHILD,A,B,X/分裂左右子树IFTDATADATATDATA/其余部分与上一题同IFTRCHILDTRCHILDSELSEINSERT_NODETRCHILD,SELSEIFSDATADATAIFTLCHILDTLCHILDSELSEINSERT_NODETLCHILD,SSLCHILDNULLSRCHILDNULL/INSERT_KEY940TYPEDEFSTRUCTINTDATAINTBFINTLSIZE/LSIZE域表示该结点的左子树的结点总数加1BLCNODELCHILD,RCHILDBLCNODE,BLCTREE/含LSIZE域的平衡二叉排序树类型BTNODELOCATE_BLCTREEBLCTREET,INTK/在含LSIZE域的平衡二叉排序树T中确定第K小的结点指针IFTRETURNNULL/K小于1或大于树结点总数IFTLSIZEKRETURNT/就是这个结点ELSEIFTLSIZEKRETURNLOCATE_BLCTREETLCHILD,K/在左子树中寻找ELSERETURNLOCATE_BLCTREETRCHILD,KTLSIZE/在右子树中寻找,注意要修改K的值/LOCATE_BLCTREE941TYPEDEFSTRUCTENUMLEAF,BRANCHTAG/结点类型标识INTKEYNUMBPLINKPARENT/双亲指针INTKEYMAXCHILD/关键字UNIONBPLINKCHILDMAXCHILD/非叶结点的孩子指针STRUCTRECTYPEINFOMAXCHILD/叶子结点的信息指针BPNODENEXT/指向下一个叶子结点的链接LEAFBPNODE,BPLINK,BPTREE/B树及其结点类型STATUSBPTREE_SEARCHBPTREET,INTKEY,BPNODEPTR,INTPOS/B树中按关键字随机查找的算法,返回包含关键字的叶子结点的指针PTR以及关键字在叶子结点中的位置POSPTWHILEPTAGBRANCH/沿分支向下查找FORI0IKEYNUMI/确定关键字所在子树IFIPKEYNUMRETURNERROR/关键字太大PPCHILDIFORI0IKEYNUMI/在叶子结点中查找IFIPKEYNUMRETURNERROR/找不到关键字PTRPPOSIRETURNOK/BPTREE_SEARCH942VOIDTRIETREE_INSERT_KEYTRIETREEQKINDLEAFQLFKKEY/建叶子结点KLENKEY0PTI1WHILEPPPBHPTRORDKEYII/自上而下查找IFPKINDBRANCH/如果最后落到分支结点无同义词PBHPTRORDKEYIQ/直接连上叶子PBHNUMELSE/如果最后落到叶子结点有同义词RTRIENODEMALLOCSIZEOFTRIENODE/建立新的分支结点LASTBHPTRORDKEYI1R/用新分支结点取代老叶子结点和上一层的联系RKINDBRANCHRBHNUM2RBHPTRORDKEYIQRBHPTRORDPLFKIP/新分支结点与新老两个叶子结点相连/TRIETREE_INSERT_KEY分析当自上而下的查找结束时,存在两种情况一种情况,树中没有待插入关键字的同义词,此时只要新建一个叶子结点并连到分支结点上即可另一种情况,有同义词,此时要把同义词的叶子结点与树断开,在断开的部位新建一个下一层的分支结点,再把同义词和新关键字的叶子结点连到新分支结点的下一层943STATUSTRIETREE_DELETE_KEYTRIETREEI1WHILEPIIFPFREEPRETURNOKELSERETURNERROR/没找到待删除元素/TRIETREE_DELETE_KEY944VOIDPRINT_HASHHASHTABLEH/按第一个字母顺序输出HASH表中的所有关键字,其中处理冲突采用线性探测开放定址法FORI1IDATAKEYQNEXTNULLNHKEYIFTNTNQ/作为链表的第一个结点ELSEFORPTNPNEXTPPNEXTPNEXTQ/插入链

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论