算法題背誦筆記-建議打印_第1頁
算法題背誦筆記-建議打印_第2頁
算法題背誦筆記-建議打印_第3頁
算法題背誦筆記-建議打印_第4頁
算法題背誦筆記-建議打印_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、順序表遞增有序,插入元素 infin( Sqlist L, in) for ( ini=0iL.length; +) ifx=p;- L.dataj+1=L.dataj ; L.datap=x ; +( L.length ) ; 刪除順序表中所有值為x 法一: voidelet( Sqlis&L, inx ) ink=0 ; fo( ini=0i=L.length-1;+i ) ifL.datai !=x ) L.datak=L.datai; +k ; L.length=k 法二: voidelet( Sqlis&L, inx ) ink=0 ; fo( ini=0i=t ) eturn fa

2、ls; fo( i=0i=s & L.datai=t ) +k ; else L.datai-k=L.datai ; L.length-=k eturn tue ; bool deletSqlist &L ) i( L.length=0 ) eturn fals; ini, j ; fo( i=0j=1; j=t | L.length=0 ) eturn fals; fo( i=0iL.length &L.datai=L.length ) eturn fals; fo(j=i; jL.length & L.dataj=t; +j ; fo( ; jC.maxsiz) eturn fals; i

3、ni=j=k=0 ; whil( iA.length & jB.length ) i( A.dataiB.dataj ) C.datak+=A.datai+ ; else C.datak+=B.dataj+ ; whil( iA.length ) C.datak+=A.datai+ ; whil( j=n | n=arry ) eturn ; inmid=(m+n)/2 ; fo( ini=0i=mid-m; +i ) intemp=Am+i; Am+i=An-i ; An-i=temp ; voichange inA , inm, inninsize everse ( A, 0, m+n-1

4、, size ) ; everse ( A, 0, n-1, size ) ; everse ( A, n, m+n-1, size ) ; 設(shè)計(jì)一個時間上盡可能高效的算法 未出現(xiàn)的最小正整數(shù) infin( inA , inn ) in*B ; B=(int *) mallocsize(int*n ) ; fo( ini=0in; +i ) Bi=0 ; fo( ini=0i0 &Ai=n ) BAi-1=1 ; fo( i=0in; +i ) i( Bi=0 ) bea; eturn i+1 若一個整數(shù)序列中有過半相同元素 元素,設(shè)計(jì)算法找出數(shù)組A( a0,a1an-1 ) 主元素(其中0a

5、in)若存在主元素則輸出, 否則返回-1 infu( inA , inn ) in*B =(int *) malloc( size(int) *n ) ; fo( ini=0in; +i ) Bi=0 ; ini, ; int max=0 ; fo( i=0i0 &Ai=n ) BAi-1+ ; fo( i=0imax ) max=Bi ; k=i ; i( maxn/2 ) eturn k+ else eturn -1 (WD 兩個遞增有序的單鏈表 有序的鏈表 voifun(LNodA, LNod*B, LNode *&C) LNod*p=A-next LNod=B-next ; LNod*

6、r ; C=A; C-next=NULL ; fe(B) ; r=C ; whil( !=NULL & !=NULL ) i( p-datadata )/若遞減有序 next=p ;/s=p, p=p-next ; p=p-next ;/s-next=C-next ; r=-next ;/ C-next=s ; /后面的循環(huán)同上 else next=; q=q-next ; r=-next ; -next=NULL ; i( !=NULL next=p ;/ 逐個插入 i(q !=NULL ) next=; 查找鏈表中是否存在一個值為x的節(jié) 則刪除結(jié)點(diǎn)并返回1,否則返回0 infinddele

7、e LNod*&C, inx ) LNod*p, ; p=C ; whil( p-next !=NULL ) i( p-nexdata=x ) bea; p=p-next ; i( p-next=NULL eturn 0 ; else q=p-next ; p-next=q-next ; fe(q) ; eturn 1; 在帶頭結(jié)點(diǎn)的單鏈表L中刪除所有值為x 并釋放空間 法一: voidelet( LNod*&L, inx ) LNod*p=L-next ; LNod*pre=L ; LNod; whil(p !=NULL ) i( p-data=x ) q=p ; pe-next=p-nex

8、; p=p-next ; fe(q) ; else pe=p ; p=p-next 法二: voidelet( LNod*&L, inx LNod*p=L-next ; LNod*r=L ; LNod; whil( !=NULL ) i( p-data !=x ) next=p ; r=p ; p=p-next ; els q=p ; p=p-next fe(q) ; next=NULL 試編寫在帶頭結(jié)點(diǎn)的單鏈表L中刪除最小值點(diǎn) 的高效算法(已知最小值唯一) voidelet( LNod*&L ) LNod*pre=L ; LNod*p=L-next ; LNod*minpe =L ; LNo

9、d*minp=L-next ; whil( p !=NULL ) i( p-datadata ) minp=p ; minpe=pe ; pe=p ; p=p-next minpe-next=minp-nex fe( minp ) ; 試編寫算法將單鏈表就地逆置 法一: voieverse ( LNod*&L ) LNod*p=L-next, r=p-next LNod*pre ; p-next=NULL ; whil( r !=NUL) pe=p; p=r; r=-next; p-next=pr; L-next=p 法二: voieverse ( LNod*&L LNod*p, r ; p=

10、L-nex; L-next=NULL ; whil( p !=NULL ) r=p-next; p-next=L-next ; L-next=p ; p=r ; 給定兩個單鏈表,找到兩個鏈表公共結(jié)點(diǎn) LinklisSeach ( LNod*L1, LNod*L2 ) inlen1=length (L1), len2=length (L2) indist ; LNod*long, short ; i( len1len2 ) long=L1-nex; short=L2-next ; dist=len1-len2 ; els long=L2-nex; short=L1-next dist=len2-

11、len1 ; whil( dis- ) long=long-next ; whil( lon!=NULL ) i( long=short ) eturn lon; els long=long-next ; short=shornext eturn NULL 給定一個單鏈表按遞增排序輸出的單鏈表中各 結(jié)點(diǎn)的數(shù)據(jù)元素 voidelet( LNod*&hea) whil( head-next !=NULL ) pe=hea; p=pre-nex; whil( p-next !=NULL ) ifp-nexdatanexdata pe=p ; p=p-next ; print( pe-nexdata

12、) u=pe-next ; pe-next=u-next ; fe(u) ; fe(head 將一個帶頭節(jié)點(diǎn)的單鏈表A分解成兩個帶頭節(jié) 點(diǎn)的單鏈表A和B,使A中含奇數(shù)元素,B 偶數(shù)元素,且相對位置不變 B=( LNod*) mallocsize(LNode*n ) ; B-next=NULL ; voicrea( LNod*&A, LNod*&B ) ini=0 ; LNod*p=A ; LNod=; r=A-next ; A-next=NULL ; whil( r !=NUL) +i ; i( i%2=0 ) q-next=r ; q=r ; els p-next=r p=r ; r=-ne

13、xt p-next=NULL q-next=NULL 將a1,b1,a2,b2an,bn拆分成 a1,a2an 和 bn,bn-1,b1 B=( LNod*) mallo( size(LNode*n ; B-next=NULL ; voicrea( LNod*&A, LNod*&B ) LNod*p=A-next ; LNod*ra=A ; LNod; whil( !=NULL ) ra-next=p ; ra=p ; p=p-next ; q=p-next ; p-next=B-next ; B-next=p ; p=q ; ra-next=NULL 刪除遞增鏈表中重復(fù)的元素 voidele

14、t( LNod*&L LNod*p=L-next ; LNod; i( p=NULL ) eturn ; whil( p-next !=NULL ) q=p-next ; i( p-data=q-data p-next=q-next ; fe(q; else p=p-next 法二: whil( p !=NULL ) i( p-data=pre-data s=p ; pe-next=p-nex; p=p-next ; fe(s) ; els pe=p ; p=p-next ; A,B兩個單鏈表遞增有序,從A,B 元素產(chǎn)生單鏈表C,要求不破環(huán)A,B結(jié)點(diǎn) voicrea( LNodA, LNod*

15、B ) LNod*p=A-next LNod=B-next ; LNod*s, C ; C= LNode *) malloc( size(LNode) ; r=C ; whil( p !=NULL & !=NULL ) i( p-datadata ) p=p-next ; elsi( p-dataq-data ) q=q-next ; els s=( LNod*) malloc(size(LNode; s-data=p-data ; next=s ; r=s ; p=p-next ; q=q-next ; next=NULL 繼續(xù)上題,將交集放到A鏈表中 voiUnion LNod*&A, L

16、Nod*&B LNod*pa=A-next, *pb=B-next ; LNod*pc=A ; whil( a !=NULL &pb !=NULL ) i( a-data=pb-data ) pc-next=pa, pc=; a=a-next ; u=pb, pb=pb-next, fee (u; elsi( a-datadata ) u=a, a=a-next, fe(u) els u=pb, pb=pb-next, fee (u whil( a !=NULL ) u=a, a=a-next, fe(u) whil( p!=NULL ) u=pb, pb=pb-next, fee (u pc

17、-next=NULL fe(B) ; 查找單鏈表中倒數(shù)第k個結(jié)點(diǎn)若成功 該節(jié)點(diǎn)的data,并返回1,否則返回0 infin( LNod*head, in) LNod*p1=head-next ; LNod*p=head ; ini=1 ; whil( p !=NULL ) p1=p1-next ; +i ; i( i) p=p-next ; i( p=hea) eturn 0 ; els printf ( “%, p-data eturn 1 : 用單鏈表保存m個整數(shù),并且|data|n,現(xiàn)在 要求設(shè)計(jì)時間復(fù)雜度盡可能高效的算法,對于 data絕對值相等的點(diǎn),僅保留第一次出現(xiàn)的點(diǎn) voifu(

18、 LNod*h, inn ) LNod*p=h ; LNod*r ; in=(in*) mallo(sizef(int) * (n+1) ) ; inm ; fo( ini=0inext != NULL ) i( p-nexdata0 ) m=p-nexdata ; els m=-p-nexdata ; i( qm=0 ) qm=1 ; p=p-next ; els r=p-next ; p-next=next fe(r) ; fe(q) int fun Dnode *L ) Dnode *p=L-next ; Dnode *q=L-prior ; while p !=q & p-next !

19、=q if ( p-data=q-data ) p=p-next ; q=q-prior else return 0 return 1 ; 有兩個循環(huán)單鏈表,鏈表頭指針分別為 試編寫函數(shù)將h2鏈表接到h1之后 仍保持循環(huán)鏈表形式 voilinLNode *&h1, LNod*&h2 ) LNod*p, ; p=h1, q=h2 ; whil( p-next !=h1 p=p-next ; whil( q-next !=h2 ) q=q-next ; p-next=h2 ; q-next=h1 ; 設(shè)有一個帶頭結(jié)點(diǎn)的循環(huán)單鏈表 整數(shù)設(shè)計(jì)算法反復(fù)找出鏈表內(nèi)最小值并不斷輸 出并將結(jié)點(diǎn)從鏈表中刪除直到

20、鏈表為空 刪除表頭結(jié)點(diǎn) voidelet( LNod*&L ) LNod*p, peminp, minp; whil( L-nex!=L ) p=L-nex; pe=L ; minp=p ; minpe=pe ; whil( p !=L ) i( p-datadata ) min=p ; minpe=pe ; pe=p; p=p-next prin( minp-data ; minpe-next=minp-nex fe(minp; fe(L) 帶頭結(jié)點(diǎn)的非循環(huán)雙向鏈表 preddatafreq(頻度) 設(shè)計(jì)算法使其按freq遞減排序 voifu( Dnod*&L, in) Dnod*p=L-n

21、ext ; Dnod; whil( p !=NULL & p-data !=) p=p-next ; i( p=NULL printf ( “不存在” ); exi(0) ; els p-feq+ ; q=p-pre; p-nexped=; p-pred-next=p-next ; whil( !=L &q-feqfeq q=q-pre; p-next=q-next ; q-nexped=p ; p-pred=; q-next=p : 設(shè)計(jì)算法判斷單鏈表的全部n個字符是否中心 對稱,例如xyx,xyyx都是中心對稱 infu( LNode *L, inn ) ini ; char s(n/2;

22、/是字符棧 p=L-nex; fo( i=0idata ; p=p-next ; i- ; i( n%2=1 ) p=p-next ; whil( !=NULL & si=p-data i- ; p=p-next ; i( i=-1 ) eturn else eturn 利用一個棧實(shí)現(xiàn)以下遞歸函數(shù)的非遞歸計(jì)算 1 Pn(x)2x 2xPn-1(x)-2(n-1)Pn2(x)n1 doubl( inn, doublx ) struct stack inno ; doublvl ; stMaxsize; intop=-1 ; doublfv1=1, fv2=2*x ; fo( i=ni=2; i-

23、 ) top+ ; sttop.no=i ; whil( top=0 ) sttop .val=2*x*fv1-2*sttop .no-1 )*fv1 fv1=fv2 ; fv2=sttop.va; top- ; i( n=0 ) eturn fv1 eturn fv2 ; 計(jì)算二叉樹中所有結(jié)點(diǎn)個數(shù) 法一: incoun( Nod*p ) inn1, n2 ; i( p=NULL ) eturn ; els n1=coun( p-lchil) ; n2=coun( p-rchil eturn n1+n2+1 ; 法二: inn=0 ; voicoun( Nod*p i( !=NULL ) +n

24、 ; coun( p-lchil; coun( p-rchil) ; 計(jì)算二叉樹中所有葉子節(jié)點(diǎn)的個數(shù) 法一: incoun( Nod*p ) inn1, n2 ; i( p=NULL ) eturn ; ifp-lchild=NUL&p- etur1 ; else n1=coun( p-lchil) ; n2=coun( p-rchil eturn n1+n2 ; 法二: inn=0 ; voicoun( Nod*p ) i( !=NULL ) ifp-lchild=NULL&p- +n ; coun( p-lchil; coun( p-rchil) ; (a-(b+c)*(d/e)存儲在二叉

25、樹,遍歷求值 incomp ( Nod*p ) inA, ; i( !=NULL ) if(p-lchil!=NULL&p-chil A=comp ( p-lchil) ; B=comp p-rchil) ; eturn o( A, B, p-data ) else eturn p-data-0 else eturn 0 / 計(jì)算二叉樹的深度 ingetDepth ( Node *p ) inLRD ; i( p=NULL ) eturn 0 ; els LD=getDepth p-lchil; RD=getDepth p-rchil) ; eturn ( LDR? LD : RD )+1 判

26、斷兩個二叉樹是否相 一個根節(jié)點(diǎn),或者左右子樹都相似) infu( Nod*Node *) inleft, right ; i( T1=NULL &T2=NULL ) eturn ; i( T1=NULL |T2=NULL ) eturn ; els right=fu( T1-lchildT2-rchil) ; left=fun T1-lchild, T2-rchil) ; eturn left & right ; voiswap ( Nod*p ) i( !=NULL ) swap ( p-lchil) ; swap ( p-chil) ; temp=p-lchil; p-lchild=p-r

27、chil: p-rchild=temp ; 查找二叉樹中data域等于key 若存在,將q指向它,否則q為空 voifu(TNode *p, Nod*&q, int ke) i( !=NULL ) i( p-data=key ) q=p; els fu(p-lchild, q, ke; fu(p-rchild, q, ke) 輸出先序遍歷第k個結(jié)點(diǎn)的值 inn=0 ; voitrav( Nod*p, ink i( !=NULL ) +n ; i( k=n ) printf ( “%, p-data eturn ; trave p-lchildk ) ; trave p-rchild, ) 利用

28、結(jié)點(diǎn)的右孩子指針將一個二叉樹的葉子節(jié) 點(diǎn)從左向右連接成一個單鏈表(head 個,tail指向最后一個) voilinBt *p, Bt*&headBt *&tail ) i( !=NULL ) i( ! p-lchil& ! p-chil) i( head=NULL ) head=p ; tail=p ; els tail-child=p tail=p ; lin( p-lchild, headtail ) ; lin( p-childhead, tai) 增加一個指向雙親節(jié)點(diǎn)的parent 針賦值,并輸出所有節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑 typedef trucNod char data ; truc

29、Node *aentlchild, chil; Nde ; voifu( Nod*p, Nod) i( !=NULL ) p-aent=; q=p ; fu( p-lchildq ; fu( p-rchild, ) ; voiprintath Nod*p whil( p !=NULL ) printf ( “%c, p-data ) ; p=p-aen; voiallth ( Nod*p i( !=NULL ) printath (p; allth (p-lchil) ; allth (p-rchild 求二叉樹中值為x的層號 inL1=1 ; voifu( Nod*p, in i( !=NU

30、LL ) i( p-data=x ) printf ( “%, L1 ; +L1 ; fu( p-lchildx ) ; fu( p-rchild, ) ; -L1 ; 輸出根節(jié)點(diǎn)到每個葉子結(jié)點(diǎn)的路徑 ini, top=0 ; char athstack maxsize ; voiallth ( Nod*p ) i( !=NULL ) athstacktop=p-data ; +top ; i( ! p-lchil& ! p-chil) fo( i0; ilchild ; allth ( p-chil -top ; 已知滿二叉樹先序序列存在于數(shù)組中,設(shè)計(jì)算法將其變成后序序列 voichange

31、 ( char pre , int L1, int R1, char post , int L2, int R) if L1data=AL1 ; fo( i=L2; Bi !=oodata; i+) ; ii L2 ) oolchild=crea( A, B, L1+1, i-L2+L1, L2, i-1 ; else oolchild=NULL ; ii child=cea( A, B, i-L2+L1+1, R1, i+1, R2 ) ; else oochild=NUL; eturoot ; 找出二叉樹中最大值的點(diǎn) voiMa( Nod*p, in&ma i( p !=NULL ) i(

32、 p-datamax ) max=p-data ; Ma( p-lchildmax ) ; Ma( p-rchild, ma) ; 一顆二叉樹以順序方式存在數(shù)組A的n個元素中 表表示 voicrea( Nod*&t, char A, ini, inj ) i( i j ) t=NULL ; els t=( Nod*) mallocsize(TNode) ; data=Ai ; creat( lchild, A, 2*i, n ) ; creat( child, A, 2*i+1, n ; 先序非遞歸遍歷二叉樹 oipeNnecursion ( Nod*bt ibt !=NULL ) Node

33、*tackmaxsize ; intop=-1 ; Node *p ; ack +top=bt whil( to!=-1 p=tacktop- visi(p) ; ip-rchil!=NULL ) ack+top=p-rchil; ip-lchil!=NULL ) ack+top=p-lchil; 中序非遞歸遍歷二叉樹 voiinNonecursion Nod*bt ibt !=NULL ) Nod*ackmaxsize ; intop=-1 ; Nod*p=bt ; whil( top !=-1 |p !=NULL ) whil( !=NULL ) tack+top=p p=p-lchil;

34、 itop !=-1 ) p=tacktop- visi(p; p=p-rchil; 后序非遞歸遍歷二叉樹 voipostNonecursion (TNode *bt Inittac(s) ; Nod*p=bt, r=NULL ; whil( p!=NULL | ! IsEmpty (s) ) i( p !=NULL ) push (s, p; p=p-lchil; els Get(s, p) ;/取棧頂結(jié)點(diǎn) i( p-chil&p-rchil!=r p=p-rchil; push (s, p; p=p-lchil; els po(s, p) visip ; r=; p=NULL ; 后序非遞

35、歸遍歷二叉樹(法二) oipostoderNonecursion(Nod*bt ibt !=NULL ) Node *tack1maxsize ; Node *tack2maxsize ; intop1=top2=-1 ; Node *p=NULL ; ack1+top1=bt ; whil( top!=-1 ) p=tack1top1- ; ack2+top2=p ; ip-lchil!=NULL ) ack1+top1=p-lchil; ip-rchil!=NULL ) ack1+top1=p-rchil whil( top!=-1 ) p=tack2top2- visi(p) ; 在二叉

36、樹中查找值為x的結(jié)點(diǎn),打印出值為 的所有祖先 oiSeach (TNode *bt, inx ) ack ack ; intop=0 ; whil( b!=NULL | top0 ) whil( b!=NULL & bdata != tac+top.t=bt ; tactop.tag=0 ; bt=blchil; ibdata=x ) fo( ini=1; idata exi(1) ; whil(top !=& tacktop.tag=1 top-; itop !=0 ) tacktop.tag=1 ; bt=acktop.chil; 找到p和q最近公共祖先結(jié)點(diǎn)r typedestruct N

37、od*t ; intag ; tack /前一題也加上這一結(jié)構(gòu)體 tack s , s1 ; Nodfun(*ot, *p, intop=0 ; Nod*bt=o; whil( bt !=NUL| top whil( bt !=NUL) s+top.t=bt ; stop.tag=0 ; bt=blchil; whil( top !=0 & Stop.tag=1 i( stop.t=p ) fo( i=1i0; -) fo( j=op1; j0; j- i( s1j.t=si.t eturn si.t top-; i( to!=0 ) stop .tag=1 ; bt=stop.chil et

38、urn NUL 層次遍歷 oilevel Node p ) infont=ear=0 ; Node uemaxsize; Node ; ip !=NUL) ear=(ear+1%maxsize ; queear=p ; whil( fon!=ea) font=(front+1%maxsize ; q=quefont; visi(q) ; iq-lchil!=NULL ) ear=(ear+1% maxsize queear=q-rchil; iq-rchil!=NULL ) ear=(ear+1% maxsize queear=q-lchil; typedestruct Node *p ; i

39、nlno ; ; inmaxNode Nod*boot ) quemaxsize ; infont=ear=0 ; inlno, i, jn, max ; iboot !=NULL ) que+ear.p=boot ; queear.lno=; whil( fon!=ea) Nod=que+frnt . Lno=quefont.lno ; iq-lchil!=NULL ) que+ear.p=q-lchil; queear.lno=Lno+; iq-rchil!=NULL ) que+ear.p=q-rchil queear.lno=Lno+; max=0 ; fo( i=1; i=lno+i

40、 ) n=0; fo( j=1; j=ear; +j iquej.lno=i +n ; imaxlchil) EnQueup-lchil) ; i( p-chil) EnQueup-chil whil( IsEmpty (s)=fals p (s, p) ; visip-data ) ; 用層次遍歷求解二叉樹的高度 inBtdepth ( Node *boot iboot=NULL ) etur; infont=-1, ear=-1 ; inlast=0, level=; Node *Qmaxsize ; Q+rear=boot ; Node *p ; whil( fontlchil) Q+r

41、ear=p-lchil; ip-rchil) Q+rear=p-chil; ifont=last ) level+ ; last=ea; eturlevel 判斷二叉樹是否為完全二叉樹 boofu( Nod*p ) IniQueu(Q) ; ip=NULL ) etur1 ; EnQueu(p) ; whil( ! IsEmpty (Q) ) DeQueu(p) ; i(p !=NULL) EnQueu( p-lchil) EnQueu( Q, p-rchil) else whil( ! IsEmpty (Q) DeQueu(p) ; ip !=NULL ) etur0 ; etur1 對樹中

42、每個元素為x的結(jié)點(diǎn) 子樹,并釋放相應(yīng)空間 voidelet( Node *bt ) i( bt !=NUL) delet( blchil; delet( bchil; fe(bt) ; voiSeach ( Node *bt, inx Nod*Q ; i( bt !=NUL) i( bdata=x ) delet(bt) ; exi(0) ; InitQueu(Q) ; EnQueu(p; whil( ! IsEmpty (Q) ) DeQueu(p) ; i( p-lchil!=NULL ) i( p-lchild-data=x delet( p-lchil) ; p-lchild=NULL

43、 ; else EnQueup-lchil) i(右子樹同上) infun ( Node *ro) Node quemaxsize ; infont=ear=wp1=deep=0 ; Node *last, ne; last=oo;new=NULL ; queear+=oo; whil( fon!=ea) Node *t=quefront+ ; if! lchil& child ) wp1+=deep*weig; ilchil!=NULL ) queear+=lchil; new=lchil; ichil!=NULL ) queear+=chil new=chil; it=last last=

44、ne; deep+=1 eturwp1 法二: infun ( Nod*p, int deep ) inwp1=0 ; i! p-lchil&! p-rchil wp1+=deep*p-weigh ; ip-lchil!=NULL ) fu( p-lchild, deep+1 ; ip-rchil!=NULL ) fu( p-childdeep+) ; eturwp1 ; 中序遍歷線索二叉樹 TNod*First ( TTNod whil( p-ltag=) p=p-lchil; eturp ; TNod*Next TTNode ip-rtag=0) eturFirst p-rchil) ;

45、else eturp-rchil: voiInThea(T*p, T*&pe) i( p !NULL ) InTheap-lchild, p) ; i( p-lchild=NULL ) p-lchild=p; p-ltag=1 ; i( pe &pe-child=NULL pe-child=p ; pe-rtag=1 ; pe=p ; InThea(p-rchild, pe voicrea( TNod*roo TTNod*pre=NULL ; i( oo!=NULL ) InTheaoot, p) ; pe-child=NULL ; pe-rtag=1 ; 編寫算法 keppe=-32151

46、; injudgeBST ( Node *bt ) inb1, b2 ; ibt=NULL ) etur; else b1=judgeBS( blchil; ib1=0 | pe=bdata ) etur; pe=bdata ; b2=judgeBS( bchil) ; eturb2 ; inlevel ( Nod*bt, Nod*p ) inn=0 ; Nod*t=bt ; ibt !=NULL ) +n ; whil( data !=p-data ) idatadata ) t=lchil; else t=chil; +n ; eturn 利用二叉樹遍歷的思想判斷一個二叉樹是否 為平衡二叉

47、樹 voifu(TNod*bt, in&alancein inbl=br=hl=hr=0 i( bt=NULL ) h=0 ; alance=1 ; elsi( ! blchil& ! bchil h=1 ; alance=1 ; else fu( blchild, blhl ) ; fu( bchild, bh) h=hlh? hl:h)+1 ; i( abs(hl-hr)adjlistj.firstar; whil( !=NULL ) ivisitp-adjvex=0 ) Visi(p-adjve; visitp-adjvex=1 ; que+ear=p-adjve; p=p-nextar

48、 深度優(yōu)先遍歷 (DFS) invisitmaxsize ; voiDFAGraph *G, inv AcNod*p ; visitv=1 ; Visi(v) ; p=G-adjlistv.firstar; whil( p !=NULL ) i( visitp-adjvex=0 DFG, p-adjve) ; p=p-nextar; 圖采用鄰接表存儲設(shè)計(jì)算法判斷i和j 之間是否有路徑(以下全是鄰接表存儲) inDFS1Agraph *G, ini, inj ) ink ; fo( k=0kn; +k ) visitk=0 ; DF(G, i) ; i( visitj=1 ) eturn ; e

49、lse eturn ; 設(shè)計(jì)算法判斷無向圖是否是一棵樹 oifu(AGrap*Ginin&vnin AcNod*p ; visitv=1 ; +v; p=G-adjlistv.firstar; whil( !=NULL ) +e; ivisitp-adjvex=0 ) fuG, p-adjvexvn, en p=p-nextar; inGiseAgraph *G ) invn=en=0 ; fo( ini=0; in; +i ) visiti=0 ; fuG, 1, vnen ; ivn=G-n & (G-n-1)=en/2 etur; else etur; 設(shè)計(jì)算法求無向連通圖距頂點(diǎn)v 結(jié)點(diǎn)

50、(即路徑長度最大) inBFS ( Agraph *G, inv ) AcNod*p ; inquemaxsize ; infont=ear=0 ; invisitmaxsize ; fo( ini=0; in; +i ) visiti=0 ; que+ear=v ; visitv=1 ; whil( fon!=ea) inj=que+font ; p=G-adjlistj.firstar; whil( !=NULL ) ivisitp-adjvex=0) visitp-adjvex=1 ; que+ear=p-adjve; p=p-nextar eturj 寫出深度優(yōu)先遍歷的非遞歸算法 vo

51、iNonDFAgraph &G, inv AcNod*p ; Inittac(s) ; fo( ini=0iadjlistj.firsta; whil( p !=NULL ) i( visitp-adjvex=0 push (s, p; visitp-adjvex=1 ; else p=p-nextar; 直接插入排序 oiInsertSort ( inR , inn ) ini, j, temp ; fo( i=1; i=& tempnext LNod*r=p-next ; p-next=NULL ; p=; whil( !=NULL ) r=p-nex; LNod*pre=L ; whil

52、( pe-next!=NULL& pe-nexdatadata pe=pe-nex; p-next=pre-nex; pe-next=p ; p=;/鏈?zhǔn)酱鎯?折半插入排序 voiInsert ( inA, inn ) ini, j ; inlohigh, mi; fo( i=2; i=n; +i ) A0=Ai; low=1 ; high=i-; whil( lowA0 .ke high=mid-; else low=mid+1 ; fo( j=i-1; j=high+1-j Aj+1=Aj ; Ahigh+1=A0 ; 希爾排序 voishellsort ( inarr , inn ) i

53、ntemp ; fo( ingap=n/2gap0; gap/=2 ) fo( ini=gapi=gap&arr arrj=arrj-gap ; j-=gap ; arrj=temp 冒泡排序 oiBubblesort ( inR, inn ini, j, flag, tem; fo( i=n-1i=1; -) flag=; fo( j=1; jRj ) temp=Rj ; Rj=Rj-1 ; Rj-1=temp ; flag=; iflag=0 etur; 快速排序 voiQuicksort ( inA , inloinhigh ilowhigh ) inpivotpos=part A, l

54、ohig) ; Quicksort A, lopivotpos-1 ; Quicksort A, pivotpos+1, high ; inart ( inA, inloinhigh ) inpivot=Alow ; whil( lowhigh ) whil( low=pivo -hig; Alow=Ahigh; whil( low high &Alow=pivot +lo; Ahigh=Alow; Alow=pivo eturlow ; 選擇排序 voiSelectSort (inA , inn inij, k, temp ; fo( i=0in; +i ) k=; fo( j=i+1; j

55、Rj ) k=; temp=Ri; Ri=Rk; Rk=temp ; 堆排序 voiSift (inarr , inloinhigh ini=loj=2*i+1 ; intemp=arri ; whil( j=high ) ijhigh &arrjarrj+1 ) +; itemp =0-i ) sif(ari, n-1 ) ; fo( i=n-1i0; -) intemp=arr0 ; arr0=arri ; arri=temp ; sif( ar0, i-) 歸并排序 in*B=(int *) malloc(n+1)*size(int) ) ; voifu(int A, int loinm

56、id, in ini=loj=mid+; fo( ink=low; k=high; +) Bk=Ak; forink=ii=mi& j=high; +k) iBi =Bj Ak=Bi+; else Ak=Bj+ ; whil( j=hig) Ak+=Bj+ whil( i=mi) Ak+=Bi+; voiMegeSort inAinloinhig ilowhigh ) inmid =low+high )/2 ; MegeSort A, lomi) ; MegeSort A, mid+1, hig) ; fu( A, lomid, high ) ; KMP算法 voigetnex( str su

57、bstint next ) ini=1, j=; next1=0 ; whil( isubst.length ) i( j=0|subst.chi=subst.chj +i, +j ; nexti=j ; else j=nextj inKMP tsttsubstinnext ) ini=j=; while(i=st.length&jsubst.length ) eturn i-subst.length ; else eturn ; (祝大家考研順利 計(jì)機(jī)考列數(shù)結(jié)應(yīng) 1 5 計(jì)機(jī)考列數(shù)結(jié)應(yīng) 2019 年408 真題【數(shù)據(jù)結(jié)構(gòu)部分 給定一個單鏈表 L:L0L1Ln-1Ln , 將其重新排列后變?yōu)椋?/p>

58、 L0LnL1Ln-1L2Ln-2 你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值,而是需要實(shí)際的進(jìn)行節(jié)點(diǎn)交換。 示例 1: 給定鏈表 1-2-3-4, 重新排列為 1-4-2-3. 示例 2: 給定鏈表 1-2-3-4-5, 重新排列為 1-5-2-4-3. 您是否想到了什么好的辦法? 2 5 計(jì)機(jī)考列數(shù)結(jié)應(yīng) 解決方法: (1)算法的基本思想: 思路(綜合題): 1.快慢指針找中點(diǎn),將原鏈表切分成兩段 2.將后面的鏈表翻轉(zhuǎn) 3.將第二個鏈表的每個結(jié)點(diǎn)依次插在第一個鏈表的后面 比如:1-2-3-4-5-null 切分變成:1-2-3-null ; 4-5-null ; 將 4-5 翻轉(zhuǎn)變成 5-4; 插入變

59、成:1-5-2-4-3-null; 考點(diǎn):快慢指針 參考 HYPERLINK /s?_biz=MzUyMzc3NzI2Nw=&mid=2247486307&idx=2&sn=76403abfbf7986df30ba0f822f2e73d2&chksm=fa362effcd41a7e943e185dd33715193f97b967dc1453b2415068b089647f591c7ff98c8a33c&token=920877469&lang=zh_CN&scene=21#wechat_redirect :每日編程(50) 考點(diǎn):翻轉(zhuǎn)鏈表 參考 HYPERLINK /s?_biz=MzUyMz

60、c3NzI2Nw=&mid=2247486170&idx=2&sn=b22952184276502080506cfc51f38878&chksm=fa362f46cd41a6503d07badf47c6e432ce8a87b503717d8bbcdea288505f636805566e3932ac&scene=21#wechat_redirect :每日編程(46) HYPERLINK /s?_biz=MzUyMzc3NzI2Nw=&mid=2247486191&idx=2&sn=bfa63455230695cb2f0d80e56a82b8f3&chksm=fa362f73cd41a665ef

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論