




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2两边子树等高为0“-”表示左重-1“/”表示右重+1“\”表示 一一AVLAVL树的高度是O(logn)的,它的平均
a-=-a-=0a-=//a-a--- \a-\a-b-\a--cc1.a->bf1,则a->bf0,以a为根的子2.a->bf0,则a->bf1,以a为根的子3.a->bf1,则a->bf+2
RR型旋转以avoidRR_rotation(AVLBinNode*a,AVLBinNode*&b){b=a-a->right=b- a->bf=b->left= b->bf=}
{AVLBinNodeb=a- c=b-a->right=c->left; b->left=c->right;c->left=a; c->right=b;switch(c->bf){case-1:a->bf=0; b->bf=1;//toleft 1:a->bf=-1; b->bf=0;//toright 0a->bfb->bf0;c c->bf= b=}ababccabLL型旋转以avoidLL_rotation(AVLBinNode*a,AVLBinNode*&b){b=a-a->left=b- a->bf=b->right= b->bf=}LR型旋转以avoidLR_rotation(AVLBinNode*a,AVLBinNode*&b){b=a- c=b-a->left=c->right; b->right=c->left;c->right=a; c->left=b;switch(c->bf){case-1:a->bf=1; b->bf=0;//toleft 1:a->bf=0; b->bf=-1;//toright 0a->bfb->bf0;c就是新叶}c->bf= b=}voidins_AVLtree(AVLBinNode*&rt,BELEMkey){AVLBinNode*s,*a,*b,*f,*p,*q;boolbalanced;ints=news->element=s->left=s->right=NULL; s->bf=0;if(rt==NULL){rt=s;return;}f=NULL;a=p=rt;q=查找swhilepNULL if(p->bf!=0){a=p;f=q;q=if(s->element<q->element)p=p->left;elsep=p-}if(s->element<q->element) q->left=s;elseq->right=if(s->element<a->element){//在a的左子树p=a->left;b=p;d=-1; elsepa->right;bp;d1;while(p!=s)if(s->element<p-{p->bf=-1;p=p-}else{p->bf= p=p->right;balanced=ifa->bf0)a->bf aelseif(a->bfd0)a->bf0;else{//失衡balancedFALSE;if(d==-1){if(b->bf==-1)LL_rotation(a,elseLR_rotation(a,b); //b->bf==+1}else{if(b->bf==+1)RR_rotation(a,elseRL_rotation(a, //b->bf==-1if(!balanced)if(f==NULL)rt=b;//a为根elseif(f->lefta)f->leftb;elsef->right=b;//f->right==}}二二AVL t(0)=1,t(1)= t(2)=t(i)=t(i-1)+t(i-2)+i3log(t(i)1)13log(n (2) AVL树的高度是O(logn)级的。因此,AVL树的插入、检索效率是O(logn)级通常高度i=log2n+C13.213.2xxaeulmlmxaxaeulmlm****you*nm** 用不同的类实现分支结点和叶结点typedefchar*Attr;classCharTreeNode{//Nodebaseclasscharsymbol;//symbolofchartreevirtualboolisLeaf()=0;//ForderivedclassIntlNode:publicCharTreeNode{CharTreeNode*left,*right;//ChildrenIntlNode(constchar&sym,CharTreeNode*l,CharTreeNode*r)//Constructor{symbol=sym;left=l;right=r;boolisLeaf(){returnFALSE;}//SubclassCharTreeNode*leftchild(){returnleft;}CharTreeNode*rightchild(){returnright;}voidsetleft(CharTreeNode*leftval){left=leftval;}//setleftchildvoidsetright(CharTreeNode*rightval){right=rightval;}//setcharvalue(){returnsymbol;}// classLeafNode:publicCharTreeNode{//LeafAttrattribute; //attributepropertyCharTreeNode*right;LeafNode(constAttr&val,CharTreeNode*rightsib=NULL){attribute=val;symbol='*';right=rightsib;}boolisLeaf(){returnTRUE;}//SubclassAttr&value(){returnattribute;}//nodevalueCharTreeNode*rightchild(){returnright;}voidtraverse(CharTreeNode*rt){//Preorderif(rt==NULL)return; //Nothingtovisitif(rt->isLeaf()){ //Doleafnodecout<<"Leaf:"<<((LeafNode*)rt)-}else{ //Dointernalnodetraverse(((IntlNode*)rt)->leftchild());traverse(((IntlNode*)rt)->rightchild());}
找双链树中结点,rt为根,val为要找的Attrdoubletree_search(CharTreeNode*rt,char*val){inti=0,len; p=rt; len=strlen(val);while(p!=NULL&&i<len)while(p!=NULL&&p->symbol<val[i])p=((IntlNode*)p)->rightchild();if(p==NULL||p->symbol>val[i])returnNULL;p((IntlNode*)p)->leftchild( //继续查找下一位 if(p==returnNULL;elseif(p->isLeaf())elsereturnNULL;没有对应的}//rt为根,q为p的前驱,attribute为要插入的属性。AttrinsertLeaf(CharTreeNode*&rt,CharTreeNode*q, CharTreeNode*p,Attrattribute){CharTreeNode*s; Attrtempattr;tempattr=newchar[strlen(attribute)];strcpy(tempattr,attribute);s=newLeafNode(tempattr,p);if(q==NULL) rt=s;elseif(((IntlNode*)q)->leftchild()==p)((IntlNode*)q)->setleft(s);else((IntlNode*)q)->setright(s);return((LeafNode*)s)->value(); //rt为根,q为p的前驱,attribute为要插入的属性AttrinsertSubtree(CharTreeNode*&rt,CharTreeNode*q, CharTreeNode*p,char*val,inti,Attr{CharTreeNode*s;intlen=s=newIntlNode(val[i],NULL,p);if(q==NULL)rt=s;elseif(((IntlNode*)q)->leftchild()==p)((IntlNode*)q)->setleft(s);else((IntlNode*)q)-}for(intj=i+1;j<len;j++)p=newIntlNode(val[j],NULL,s=((IntlNode*)s)-}returninsertLeaf(rt,s,NULL,}插入普通的关键码,关键码并不需要以“*”结尾Attrdoubletree_insert(CharTreeNode*&rt,char*val,Attrattribute){inti=0,len; CharTreeNode*p,*q;p=rt; q=NULL;len=strlen(val);if(rt==NULL)returninsertSubtree(rt,q,val,i,attribute);while(p!=NULL&&i<len){while(p!=NULL&&p->symbol<{q=p=((IntlNode*)p)->rightchild( if(p!=NULL&&p->symbol=={q=p=((IntlNode*)p)->leftchild(ifilen-1i++;elseif(p-return((LeafNode*)p)->value();elsereturninsertLeaf(rt,q,p, elsereturninsertSubtree(rt,q,p,val,i,}//ofwhile(p!=NULL&&i<len)returnNULL; 设基为d(字母为d=26,数字为d(1)h(1+d)/2(2)最大存储空间为三三trietypedefcharELEM; typedefELEM*Attr;constbase=26; conststart='a';enumNodetype{leafnode,internal};classTrieNode{ //GenericnodeclassNodetypemytype;//Typeforthisnodecharsymbol; //Internalnodevalueunion{struct{//StructureforinternalnodeTrieNode*trieptr[base+1];int //thenumberof}struct{ //StructforleafnodeELEM*data; //keyofleafnodeAttrattribute;//Thepropertyof} TrieNode(constAttrval)//Constructor:{mytype=leafnode;leaf.attribute=val;TrieNode(intcnt=0){//Constructor:Internalmytype=internal;intl.count=cnt;for(inti=0;i<base+1;i++)intl.trieptr[i]=NULL;}boolisLeaf(){returnmytype==leafnode;voidtraverse(TrieNode*rt){//Preorderif(rt==NULL)return;if(rt-cout<<"Leaf:"<<rt-<<elsefor(inti=0;i<base+1;i++)}}rt为根,q为前驱,attribute为要插入的属性。AttrinsertLeaf(TrieNode*q,Attrattribute){TrieNodes=newTrieNode(attribute);q->intl.trieptr[0]=s;s->leaf.attribute=newchar[strlen(attribute)];strcpy(s->leaf.attribute,attribute);returns-}AttrinsertSubtree(TrieNode*&q,ELEM*val,intk,Attrattribute){TrieNode*s; len=strlen(val);s=newTrieNode(0);if(q==NULL)q=s;else{q->intl.trieptr[val[k]-start+1]=s;}for(intj=k+1;j<len;j++)newTrieNode(0);}returninse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年媒体经营合作协议书
- 2025年度物流车辆维修配件供应合同
- 2025年度新型建筑材料应用示范工程售后服务保障书
- 2025年激光影像输出胶片项目合作计划书
- 2025年度国际物流公司项目总监聘用合同模板3篇
- 优化幼儿园教研学期工作计划的管理与执行
- 客户化需求对仓库的影响计划
- 建立规范的接待标准与流程计划
- 社区养老服务体系的完善计划
- 班主任我们永远的信仰计划
- 2025年江苏省高职单招《职测》高频必练考试题库400题(含答案)
- 工厂安全事故预防知识
- 2024年中考语文试题分类汇编:散文、小说阅读(第03期)含答案及解析
- 《宫颈癌筛查》课件
- 2024年江西应用工程职业学院高职单招职业适应性测试历年参考题库含答案解析
- 2024年中储粮油脂有限公司招聘笔试真题
- 消化科护理疑难病例讨论
- 中医护理技术操作质量控制
- 杭氧股份深度报告:工业气体龙头期待2025景气复苏
- 2024年学校意识形态工作总结
- (正式版)JBT 14449-2024 起重机械焊接工艺评定
评论
0/150
提交评论