版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2021年青海省數(shù)據(jù)概述大綱 2021年青海省數(shù)據(jù)概述大綱 1、假設(shè)以鄰接矩陣作為圖的存儲結(jié)構(gòu),編寫算法判別在給定的有向圖中是否存在一個(gè)簡潔有向回路,若存在,則以頂點(diǎn)序列的方式輸出該回路(找到一條即可)。(注:圖中不存在頂點(diǎn)到自己的?。?有向圖推斷回路要比無向圖簡單。利用深度優(yōu)先遍歷,將頂點(diǎn)分成三類:未訪問;已訪問但其鄰接點(diǎn)未訪問完;已訪問且其鄰接點(diǎn)已訪問完。下面用0,1,2表示這三種狀態(tài)。前面已提到,若dfs(v)結(jié)束前消失頂點(diǎn)u到v的回邊,則圖中必有包含頂點(diǎn)v和u的回路。對應(yīng)程序中v的狀態(tài)為1,而u是正訪問的頂點(diǎn),若我們找出u的下一鄰接點(diǎn)的狀態(tài)為1,就可以輸出回路了。void print(
2、int v,int start ) /輸出從頂點(diǎn)start開頭的回路。for(i=1;i=n;i+)if(gvi!=0 visitedi=1 ) /若存在邊(v,i),且頂點(diǎn)i的狀態(tài)為1。printf(“%d”,v);if(i=start) printf(“n”); else print(i,start);break;/if/printvoid dfs(int v)visitedv=1;for(j=1;j=n;j+ )if (gvj!=0) /存在邊(v,j)if (visitedj!=1) if (!visitedj) dfs(j); /ifelse cycle=1; print(j,j);
3、visitedv=2;/dfsvoid find_cycle() /推斷是否有回路,有則輸出鄰接矩陣。visited數(shù)組為全局變量。for (i=1;i=n;i+) visitedi=0;for (i=1;i=n;i+ ) if (!visitedi) dfs(i);/find_cycle2、兩棵空二叉樹或僅有根結(jié)點(diǎn)的二叉樹相像;對非空二叉樹,可判左右子樹是否相像,采納遞歸算法。int similar(bitree p,q) /推斷二叉樹p和q是否相像if(p=null q=null) return (1);else if(!p q | p !q) return (0);else return
4、(similar(p-lchild,q-lchild) similar(p-rchild,q-rchild)/結(jié)束similar3、依據(jù)二叉排序樹中序遍歷所得結(jié)點(diǎn)值為增序的性質(zhì),在遍歷中將當(dāng)前遍歷結(jié)點(diǎn)與其前驅(qū)結(jié)點(diǎn)值比較,即可得出結(jié)論,為此設(shè)全局指針變量pre(初值為null)和全局變量flag,初值為true。若非二叉排序樹,則置flag為false。#define true 1#define false 0typedef struct nodedatatype data; struct node *llink,*rlink; *btree;void judgebst(btree t,int
5、flag)/ 推斷二叉樹是否是二叉排序樹,本算法結(jié)束后,在調(diào)用程序中由flag得出結(jié)論。 if(t!=null flag) judgebst(t-llink,flag);/ 中序遍歷左子樹if(pre=null)pre=t;/ 中序遍歷的第一個(gè)結(jié)點(diǎn)不必推斷else if(pre-datat-data)pre=t;/前驅(qū)指針指向當(dāng)前結(jié)點(diǎn)elseflag=flase; /不是完全二叉樹 judgebst (t-rlink,flag);/ 中序遍歷右子樹/judgebst算法結(jié)束4、假設(shè)以i和o分別表示入棧和出棧操作。棧的初態(tài)和終態(tài)均為空,入棧和出棧的操作序列可表示為僅由i和o組成的序列,稱可以操作
6、的序列為合法序 2021年青海省數(shù)據(jù)概述大綱 列,否則稱為非法序列。(15分) (1)a和d是合法序列,b和c 是非法序列。(2)設(shè)被判定的操作序列已存入一維數(shù)組a中。int judge(char a)/推斷字符數(shù)組a中的輸入輸出序列是否是合法序列。如是,返回true,否則返回false。i=0; /i為下標(biāo)。j=k=0; /j和k分別為i和字母o的的個(gè)數(shù)。while(ai!=0) /當(dāng)未到字符數(shù)組尾就作。switch(ai)casei: j+; break; /入棧次數(shù)增1。caseo: k+; if(kj)printf(“序列非法n”);exit(0);i+; /不論ai是i或o,指針i均
7、后移。if(j!=k) printf(“序列非法n”);return(false);else printf(“序列合法n”);return(true);/算法結(jié)束。5、假設(shè)k1,kn是n個(gè)關(guān)鍵詞,試解答:試用二叉查找樹的插入算法建立一棵二叉查找樹,即當(dāng)關(guān)鍵詞的插入次序?yàn)閗1,k2,kn時(shí),用算法建立一棵以llink / rlink 鏈接表示的二叉查找樹。6、設(shè)一組有序的記錄關(guān)鍵字序列為(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求計(jì)算出查找關(guān)鍵字62時(shí)的比較次數(shù)并計(jì)算出查找勝利時(shí)的平均查找長度。7、對二叉樹的某層上的結(jié)點(diǎn)進(jìn)行運(yùn)算,采納隊(duì)列結(jié)構(gòu)按層次遍歷最相宜
8、。int leafklevel(bitree bt, int k) /求二叉樹bt 的第k(k1) 層上葉子結(jié)點(diǎn)個(gè)數(shù)if(bt=null | k1) return(0);bitree p=bt,q; /q是隊(duì)列,元素是二叉樹結(jié)點(diǎn)指針,容量足夠大int front=0,rear=1,leaf=0; /front 和rear是隊(duì)頭和隊(duì)尾指針, leaf是葉子結(jié)點(diǎn)數(shù)int last=1,level=1; q1=p; /last是二叉樹同層最右結(jié)點(diǎn)的指針,level 是二叉樹的層數(shù)while(front=rear)p=q+front;if(level=k !p-lchild !p-rchild) le
9、af+; /葉子結(jié)點(diǎn)if(p-lchild) q+rear=p-lchild; /左子女入隊(duì)if(p-rchild) q+rear=p-rchild; /右子女入隊(duì)if(front=last) level+; /二叉樹同層最右結(jié)點(diǎn)已處理,層數(shù)增1last=rear; /last移到指向下層最右一元素if(levelk) return (leaf); /層數(shù)大于k 后退出運(yùn)行/while /結(jié)束leafklevel8、請編寫一個(gè)判別給定二叉樹是否為二叉排序樹的算法,設(shè)二叉樹用llink-rlink法存儲。9、4、void linklist_reverse(linklist l)/鏈表的就地逆置;
10、為簡化算法,假設(shè)表長大于2p=l-next;q=p-next;s=q-next;p-next=null;while(s-next)q-next=p;p=q;q=s;s=s-next; /把l的元素逐個(gè)插入新表表頭q-next=p;s-next=q;l-next=s;/linklist_reverse10、請?jiān)O(shè)計(jì)一個(gè)算法,要求該算法把二叉樹的葉子結(jié)點(diǎn)按從左到右的挨次連成一個(gè)單鏈表,表頭 2021年青海省數(shù)據(jù)概述大綱 指針為head。 二叉樹按二叉鏈表方式存儲,鏈接時(shí)用葉子結(jié)點(diǎn)的右指針域來存放單鏈表指針。分析你的算法的時(shí)、空簡單度。 11、設(shè)一棵二叉樹的結(jié)點(diǎn)結(jié)構(gòu)為 (llink,info,rlin
11、k),root為指向該二叉樹根結(jié)點(diǎn)的指針,p和q分別為指向該二叉樹中任意兩個(gè)結(jié)點(diǎn)的指針,試編寫一算法ancestor(root,p,q,r),該算法找到p和q的最近共同祖先結(jié)點(diǎn)r。12、設(shè)有一組初始記錄關(guān)鍵字序列(k1,k2,kn),要求設(shè)計(jì)一個(gè)算法能夠在o(n)的時(shí)間簡單度內(nèi)將線性表劃分成兩部分,其中左半部分的每個(gè)關(guān)鍵字均小于ki,右半部分的每個(gè)關(guān)鍵字均大于等于ki。void quickpass(int r, int s, int t)int i=s, j=t, x=rs;while(ij)while (ij rjx) j=j-1; if (ij) ri=rj;i=i+1;while (ij
12、 rix) i=i+1; if (ij) rj=ri;j=j-1;ri=x;13、本題要求建立有序的循環(huán)鏈表。從頭到尾掃描數(shù)組a,取出ai(0=in),然后到鏈表中去查找值為ai的結(jié)點(diǎn),若查找失敗,則插入。linkedlist creat(elemtype a,int n)/由含n個(gè)數(shù)據(jù)的數(shù)組a生成循環(huán)鏈表,要求鏈表有序并且無值重復(fù)結(jié)點(diǎn)linkedlist h;h=(linkedlist)malloc(sizeof(lnode);/申請結(jié)點(diǎn)h-next=h; /形成空循環(huán)鏈表for(i=0;in;i+)pre=h;p=h-next;while(p!=h p-dataai)pre=p; p=p-
13、next; /查找ai的插入位置if(p=h | p-data!=ai) /重復(fù)數(shù)據(jù)不再輸入s=(linkedlist)malloc(sizeof(lnode);s-data=ai; pre-next=s; s-next=p;/將結(jié)點(diǎn)s鏈入鏈表中/forreturn(h);算法結(jié)束14、給定n個(gè)村莊之間的交通圖,若村莊i和j之間有道路,則將頂點(diǎn)i和j用邊連接,邊上的wij表示這條道路的長度,現(xiàn)在要從這n個(gè)村莊中選擇一個(gè)村莊建一所醫(yī)院,問這所醫(yī)院應(yīng)建在哪個(gè)村莊,才能使離醫(yī)院最遠(yuǎn)的村莊到醫(yī)院的路程最短?試設(shè)計(jì)一個(gè)解答上述問題的算法,并應(yīng)用該算法解答如圖所示的實(shí)例。(20分)15、設(shè)有一組初始記錄關(guān)
14、鍵字為(45,80,48,40,22,78),要求構(gòu)造一棵二叉排序樹并給出構(gòu)造過程。16、設(shè)一組有序的記錄關(guān)鍵字序列為(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求計(jì)算出查找關(guān)鍵字62時(shí)的比較次數(shù)并計(jì)算出查找勝利時(shí)的平均查找長度。17、后序遍歷最終訪問根結(jié)點(diǎn),即在遞歸算法中,根是壓在棧底的。采納后序非遞歸算法,棧中存放二叉樹結(jié)點(diǎn)的指針,當(dāng)訪問到某結(jié)點(diǎn)時(shí),棧中全部元素均為該結(jié)點(diǎn)的祖先。本題要找p和q 的最近共同祖先結(jié)點(diǎn)r ,不失一般性,設(shè)p在q的左邊。后序遍歷必定先遍歷到結(jié)點(diǎn)p,棧中元素均為p的祖先。將??饺肓硪粠椭鷹V小T龠B續(xù)遍歷到結(jié)點(diǎn)q時(shí),將棧中元素從棧頂
15、開頭逐個(gè)到幫助棧中去匹配,第一個(gè)匹 2021年青海省數(shù)據(jù)概述大綱 配(即相等)的元素就是結(jié)點(diǎn)p 和q的最近公共祖先。 typedef structbitree t;int tag;/tag=0 表示結(jié)點(diǎn)的左子女已被訪問,tag=1表示結(jié)點(diǎn)的右子女已被訪問stack;stack s,s1;/棧,容量夠大bitree ancestor(bitree root,p,q,r)/求二叉樹上結(jié)點(diǎn)p和q的最近的共同祖先結(jié)點(diǎn)r。top=0; bt=root;while(bt!=null |top0)while(bt!=null bt!=p bt!=q) /結(jié)點(diǎn)入棧s+top.t=bt; stop.tag=0;
16、 bt=bt-lchild; /沿左分枝向下if(bt=p) /不失一般性,假定p在q的左側(cè),遇結(jié)點(diǎn)p時(shí),棧中元素均為p的祖先結(jié)點(diǎn)for(i=1;i=top;i+) s1i=si; top1=top; /將棧s的元素轉(zhuǎn)入幫助棧s1 保存if(bt=q) /找到q 結(jié)點(diǎn)。for(i=top;i0;i-)/;將棧中元素的樹結(jié)點(diǎn)到s1去匹配pp=si.t;for (j=top1;j0;j-)if(s1j.t=pp) printf(“p 和q的最近共同的祖先已找到”);return (pp);while(top!=0 stop.tag=1) top-; /退棧if (top!=0)stop.tag=1
17、;bt=stop.t-rchild; /沿右分枝向下遍歷/結(jié)束while(bt!=null |top0)return(null);/、p無公共祖先/結(jié)束ancestor18、設(shè)t是給定的一棵二叉樹,下面的遞歸程序count(t)用于求得:二叉樹t中具有非空的左,右兩個(gè)兒子的結(jié)點(diǎn)個(gè)數(shù)n2;只有非空左兒子的個(gè)數(shù)nl;只有非空右兒子的結(jié)點(diǎn)個(gè)數(shù)nr和葉子結(jié)點(diǎn)個(gè)數(shù)n0。n2、nl、nr、n0都是全局量,且在調(diào)用count(t)之前都置為0.typedef struct nodeint data; struct node *lchild,*rchild;node;int n2,nl,nr,n0;void
18、count(node *t)if (t-lchild!=null) if (1)_ n2+; else nl+;else if (2)_ nr+; else (3)_ ;if(t-lchild!=null)(4)_; if (t-rchild!=null) (5)_;26.樹的先序非遞歸算法。void example(b)btree *b; btree *stack20, *p;int top;if (b!=null) top=1; stacktop=b;while (top0) p=stacktop; top-;printf(“%d”,p-data);if (p-rchild!=null)(
19、1)_; (2)_;if (p-lchild!=null)(3)_; (4)_;19、給定n個(gè)村莊之間的交通圖,若村莊i和j之間有道路,則將頂點(diǎn)i和j用邊連接,邊上的wij表示這條道路的長度,現(xiàn)在要從這n個(gè)村莊中選擇一個(gè)村莊建一所醫(yī)院,問這所醫(yī)院應(yīng)建在哪個(gè)村莊,才能使離醫(yī)院最遠(yuǎn)的村莊到醫(yī)院的路程最短?試設(shè)計(jì)一個(gè)解答上述問題的算法,并應(yīng)用該算法解答如圖所示的實(shí)例。20分void hospital(adjmatrix w,int n)/在以鄰接帶權(quán)矩陣表示的n個(gè)村莊中,求醫(yī)院建在何處,使離醫(yī)院最遠(yuǎn)的村莊到醫(yī)院的路徑最短。for (k=1;k=n;k+) /求任意兩頂點(diǎn)間的最短路徑for (i=1;
20、i=n;i+)for (j=1;j=n;j+)if (wik+wkjwij) wij=wik+wkj;m=maxint; /設(shè)定m為機(jī)器內(nèi)最大整數(shù)。for (i=1;i=n;i+) /求最長路徑中最短的一條。s=0;for (j=1;j=n;j+) /求從某村 2021年青海省數(shù)據(jù)概述大綱 莊i(1=i=n)到其它村莊的最長路徑。 if (wijs) s=wij;if (s=m) m=s; k=i;/在最長路徑中,取最短的一條。m記最長路徑,k記動身頂點(diǎn)的下標(biāo)。printf(“醫(yī)院應(yīng)建在%d村莊,到醫(yī)院距離為%dn”,i,m);/for/算法結(jié)束對以上實(shí)例模擬的過程略。各行中最大數(shù)依次是9,9
21、,6,7,9,9。這幾個(gè)最大數(shù)中最小者為6,故醫(yī)院應(yīng)建在第三個(gè)村莊中,離醫(yī)院最遠(yuǎn)的村莊到醫(yī)院的距離是6。1、對圖1所示的連通網(wǎng)g,請用prim算法構(gòu)造其最小生成樹(每選取一條邊畫一個(gè)圖)。20、設(shè)一棵二叉樹的結(jié)點(diǎn)結(jié)構(gòu)為 (llink,info,rlink),root為指向該二叉樹根結(jié)點(diǎn)的指針,p和q分別為指向該二叉樹中任意兩個(gè)結(jié)點(diǎn)的指針,試編寫一算法ancestor(root,p,q,r),該算法找到p和q的最近共同祖先結(jié)點(diǎn)r。21、設(shè)一棵樹t中邊的集合為(a,b),(a,c),(a,d),(b,e),(c,f),(c,g),要求用孩子兄弟表示法(二叉鏈表)表示出該樹的存儲結(jié)構(gòu)并將該樹轉(zhuǎn)化成對
22、應(yīng)的二叉樹。22、設(shè)有一組初始記錄關(guān)鍵字為(45,80,48,40,22,78),要求構(gòu)造一棵二叉排序樹并給出構(gòu)造過程。23、冒泡排序算法是把大的元素向上移(氣泡的上?。部梢园研〉脑叵蛳乱疲馀莸南鲁粒┱埥o出上浮和下沉過程交替的冒泡排序算法。48.有n個(gè)記錄存儲在帶頭結(jié)點(diǎn)的雙向鏈表中,現(xiàn)用雙向起泡排序法對其按上升序進(jìn)行排序,請寫出這種排序的算法。(注:雙向起泡排序即相鄰兩趟排序向相反方向起泡)24、設(shè)有一組初始記錄關(guān)鍵字序列(k1,k2,kn),要求設(shè)計(jì)一個(gè)算法能夠在o(n)的時(shí)間簡單度內(nèi)將線性表劃分成兩部分,其中左半部分的每個(gè)關(guān)鍵字均小于ki,右半部分的每個(gè)關(guān)鍵字均大于等于ki。voi
23、d quickpass(int r, int s, int t)int i=s, j=t, x=rs;while(ij)while (ij rjx) j=j-1; if (ij) ri=rj;i=i+1;while (ij rix) i=i+1; if (ij) rj=ri;j=j-1;ri=x;25、 將頂點(diǎn)放在兩個(gè)集合v1和v2。對每個(gè)頂點(diǎn),檢查其和鄰接點(diǎn)是否在同一個(gè)集合中,如是,則為非二部圖。為此,用整數(shù)1和2表示兩個(gè)集合。再用一隊(duì)列結(jié)構(gòu)存放圖中訪問的頂點(diǎn)。int bpgraph (adjmatrix g)/推斷以鄰接矩陣表示的圖g是否是二部圖。int s; /頂點(diǎn)向量,元素值表示其屬于
24、那個(gè)集合(值1和2表示兩個(gè)集合)int q;/q為隊(duì)列,元素為圖的頂點(diǎn),這里設(shè)頂點(diǎn)信息就是頂點(diǎn)編號。int f=0,r,visited; /f和r分別是隊(duì)列的頭尾指針,visited是訪問數(shù)組for (i=1;i=n;i+) visitedi=0;si=0; /初始化,各頂點(diǎn)未確定屬于那個(gè)集合q1=1; r=1; s1=1;/頂點(diǎn)1放入集合s1while(fr)v=q+f; if (sv=1 2021年青海省數(shù)據(jù)概述大綱 ) jh=2; else jh=1;/預(yù)備v的鄰接點(diǎn)的集合號 if (!visitedv)visitedv=1; /確保對每一個(gè)頂點(diǎn),都要檢查與其鄰接點(diǎn)不應(yīng)在一個(gè)集合中for
25、 (j=1,j=n;j+)if (gvj=1)if (!sj) sj=jh; q+r=j; /鄰接點(diǎn)入隊(duì)列else if (sj=sv) return(0); /非二部圖/if (!visitedv)/whilereturn(1); /是二部圖算法爭論 題目給的是連通無向圖,若非連通,則算法要修改。26、由二叉樹的前序遍歷和中序遍歷序列能確定唯一的一棵二叉樹,下面程序的作用是實(shí)現(xiàn)由已知某二叉樹的前序遍歷和中序遍歷序列,生成一棵用二叉鏈表表示的二叉樹并打印出后序遍歷序列,請寫出程序所缺的語句。#define max 100typedef struct nodechar info; struct
26、node *llink, *rlink; tnode;char predmax,inodmax;main(int argc,int *argv) tnode *root;if(argc3) exit 0;strcpy(pred,argv1); strcpy(inod,argv2);root=restore(pred,inod,strlen(pred);postorder(root);tnode *restore(char *ppos,char *ipos,int n) tnode *ptr; char *rpos; int k;if(n=0) return null;ptr-info=(1)_
27、;for(2)_ ; rposipos+n;rpos+) if(*rpos=*ppos) break;k=(3)_;ptr-llink=restore(ppos+1, (4)_,k );ptr-rlink=restore (5)_+k,rpos+1,n-1-k);return ptr;postorder(tnode*ptr) if(ptr=null) return;postorder(ptr-llink); postorder(ptr-rlink); printf(“%c”,ptr-info);27、4、void linklist_reverse(linklist l)/鏈表的就地逆置;為簡化
28、算法,假設(shè)表長大于2p=l-next;q=p-next;s=q-next;p-next=null;while(s-next)q-next=p;p=q;q=s;s=s-next; /把l的元素逐個(gè)插入新表表頭q-next=p;s-next=q;l-next=s;/linklist_reverse28、矩陣中元素按行和按列都已排序,要求查找時(shí)間簡單度為o(m+n),因此不能采納常規(guī)的二層循環(huán)的查找??梢韵葟挠疑辖牵╥=a,j=d)元素與x比較,只有三種狀況:一是ai,jx, 這狀況下向j 小的方向連續(xù)查找;二是ai,jx,下步應(yīng)向i大的方向查找;三是ai,j=x,查找勝利。否則,若下標(biāo)已超出范圍,
29、則查找失敗。void search(datatype a , int a,b,c,d, datatype x)/n*m矩陣a,行下標(biāo)從a到b,列下標(biāo)從c到d,本算法查找x是否在矩陣a中.i=a; j=d; flag=0; /flag是勝利查到x的標(biāo)志while(i=b j=c)if(aij=x) flag=1;break;else if (aijx) j-; else i+;if(flag) printf(“a%d%d=%d”,i,j,x); /假定x為整型.else printf(“矩陣a中無%d 元素”,x);算法search結(jié)束。算法爭論算法中查找x的路線從右上角開頭,向下(當(dāng)xai,j
30、)或向左(當(dāng)xai,j)。向下最多是m,向左最多是n。最佳狀況是在右上角比較一次勝利,最差是在左下角(ab,c),比較m+n次,故算法最差時(shí)間簡單度 2021年青海省數(shù)據(jù)概述大綱 是o(m+n)。 29、假設(shè)k1,kn是n個(gè)關(guān)鍵詞,試解答:試用二叉查找樹的插入算法建立一棵二叉查找樹,即當(dāng)關(guān)鍵詞的插入次序?yàn)閗1,k2,kn時(shí),用算法建立一棵以llink / rlink 鏈接表示的二叉查找樹。30、已知有向圖g=(v,e),其中v=v1,v2,v3,v4,v5,v6,v7,e=v1,v2,v1,v3,v1,v4,v2,v5,v3,v5,v3,v6,v4,v6,v5,v7,v6,v7寫出g的拓?fù)渑判?/p>
31、的結(jié)果。g拓?fù)渑判虻慕Y(jié)果是:v1、v2、v4、v3、v5、v6、v731、 二叉樹的層次遍歷序列的第一個(gè)結(jié)點(diǎn)是二叉樹的根。實(shí)際上,層次遍歷序列中的每個(gè)結(jié)點(diǎn)都是“局部根”。確定根后,到二叉樹的中序序列中,查到該結(jié)點(diǎn),該結(jié)點(diǎn)將二叉樹分為“左根右”三部分。若左、右子樹均有,則層次序列根結(jié)點(diǎn)的后面應(yīng)是左右子樹的根;若中序序列中只有左子樹或只有右子樹,則在層次序列的根結(jié)點(diǎn)后也只有左子樹的根或右子樹的根。這樣,定義一個(gè)全局變量指針r,指向?qū)哟涡蛄写幚碓?。算法中先處理根結(jié)點(diǎn),將根結(jié)點(diǎn)和左右子女的信息入隊(duì)列。然后,在隊(duì)列不空的條件下,循環(huán)處理二叉樹的結(jié)點(diǎn)。隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu)定義如下:typedef st
32、ruct int lvl; /層次序列指針,總是指向當(dāng)前“根結(jié)點(diǎn)”在層次序列中的位置int l,h; /中序序列的下上界int f; /層次序列中當(dāng)前“根結(jié)點(diǎn)”的雙親結(jié)點(diǎn)的指針int lr; / 1雙親的左子樹 2雙親的右子樹qnode;bitree creat(datatype in,level,int n)/由二叉樹的層次序列l(wèi)eveln和中序序列inn生成二叉樹。 n是二叉樹的結(jié)點(diǎn)數(shù)if (n1) printf(“參數(shù)錯(cuò)誤n”); exit(0);qnode s,q; /q是元素為qnode類型的隊(duì)列,容量足夠大init(q); int r=0; /r是層次序列指針,指向當(dāng)前待處理的結(jié)點(diǎn)
33、bitree p=(bitree)malloc(sizeof(binode); /生成根結(jié)點(diǎn)p-data=level0; p-lchild=null; p-rchild=null; /填寫該結(jié)點(diǎn)數(shù)據(jù)for (i=0; in; i+) /在中序序列中查找根結(jié)點(diǎn),然后,左右子女信息入隊(duì)列if (ini=level0) break;if (i=0) /根結(jié)點(diǎn)無左子樹,遍歷序列的1n-1是右子樹p-lchild=null;s.lvl=+r; s.l=i+1; s.h=n-1; s.f=p; s.lr=2; enqueue(q,s);else if (i=n-1) /根結(jié)點(diǎn)無右子樹,遍歷序列的1n-1是
34、左子樹p-rchild=null;s.lvl=+r; s.l=1; s.h=i-1; s.f=p; s.lr=1; enqueue(q,s);else /根結(jié)點(diǎn)有左子樹和右子樹s.lvl=+r; s.l=0; s.h=i-1; s.f=p; s.lr=1;enqueue(q,s);/左子樹有關(guān)信息入隊(duì)列s.lvl=+r; s.l=i+1;s.h=n-1;s.f=p; s.lr=2;enqueue(q,s);/右子樹有關(guān)信息入隊(duì)列while (!empty(q) /當(dāng)隊(duì)列不空,進(jìn)行循環(huán),構(gòu)造二叉樹的左右子樹 s=delqueue(q); father=s.f;for (i=s.l; i=s.h;
35、 i+)if (ini=levels.lvl) break;p=(bitreptr)malloc(sizeof(binode); 2021年青海省數(shù)據(jù)概述大綱 /申請結(jié)點(diǎn)空間 p-data=levels.lvl; p-lchild=null; p-rchild=null; /填寫該結(jié)點(diǎn)數(shù)據(jù)if (s.lr=1) father-lchild=p;else father-rchild=p; /讓雙親的子女指針指向該結(jié)點(diǎn)if (i=s.l)p-lchild=null; /處理無左子女s.lvl=+r; s.l=i+1; s.f=p; s.lr=2; enqueue(q,s);else if (i=s
36、.h)p-rchild=null; /處理無右子女s.lvl=+r; s.h=i-1; s.f=p; s.lr=1; enqueue(q,s);elses.lvl=+r; s.h=i-1; s.f=p; s.lr=1; enqueue(q,s);/左子樹有關(guān)信息入隊(duì)列s.lvl=+r; s.l=i+1; s.f=p; s.lr=2; enqueue(q,s); /右子樹有關(guān)信息入隊(duì)列/結(jié)束while (!empty(q)return(p);/算法結(jié)束32、后序遍歷最終訪問根結(jié)點(diǎn),即在遞歸算法中,根是壓在棧底的。采納后序非遞歸算法,棧中存放二叉樹結(jié)點(diǎn)的指針,當(dāng)訪問到某結(jié)點(diǎn)時(shí),棧中全部元素均為該結(jié)
37、點(diǎn)的祖先。本題要找p和q 的最近共同祖先結(jié)點(diǎn)r ,不失一般性,設(shè)p在q的左邊。后序遍歷必定先遍歷到結(jié)點(diǎn)p,棧中元素均為p的祖先。將??饺肓硪粠椭鷹V?。再連續(xù)遍歷到結(jié)點(diǎn)q時(shí),將棧中元素從棧頂開頭逐個(gè)到幫助棧中去匹配,第一個(gè)匹配(即相等)的元素就是結(jié)點(diǎn)p 和q的最近公共祖先。typedef structbitree t;int tag;/tag=0 表示結(jié)點(diǎn)的左子女已被訪問,tag=1表示結(jié)點(diǎn)的右子女已被訪問stack;stack s,s1;/棧,容量夠大bitree ancestor(bitree root,p,q,r)/求二叉樹上結(jié)點(diǎn)p和q的最近的共同祖先結(jié)點(diǎn)r。top=0; bt=root;
38、while(bt!=null |top0)while(bt!=null bt!=p bt!=q) /結(jié)點(diǎn)入棧s+top.t=bt; stop.tag=0; bt=bt-lchild; /沿左分枝向下if(bt=p) /不失一般性,假定p在q的左側(cè),遇結(jié)點(diǎn)p時(shí),棧中元素均為p的祖先結(jié)點(diǎn)for(i=1;i=top;i+) s1i=si; top1=top; /將棧s的元素轉(zhuǎn)入幫助棧s1 保存if(bt=q) /找到q 結(jié)點(diǎn)。for(i=top;i0;i-)/;將棧中元素的樹結(jié)點(diǎn)到s1去匹配pp=si.t;for (j=top1;j0;j-)if(s1j.t=pp) printf(“p 和q的最近共
39、同的祖先已找到”);return (pp);while(top!=0 stop.tag=1) top-; /退棧if (top!=0)stop.tag=1;bt=stop.t-rchild; /沿右分枝向下遍歷/結(jié)束while(bt!=null |top0)return(null);/、p無公共祖先/結(jié)束ancestor33、我們用l代表最長平臺的長度,用k指示最長平臺在數(shù)組b中的起始位置(下標(biāo))。用j記住局部平臺的起始位置,用i指示掃描b數(shù)組的下標(biāo),i從0開頭,依次和后續(xù)元素比較,若局部平臺長度(i-j)大于l時(shí),則修改最長平臺的長度k(l=i-j)和其在b中的起始位置(k=j),直到b數(shù)組
40、結(jié)束,l即為所求。void platform (int b , int n)/求具有n個(gè)元素的整型數(shù)組b中最長平臺的長度。l=1;k=0;j=0;i=0;while(in-1)while(in-1 bi=bi+1) i+;if(i-j+1l) 2021年青海省數(shù)據(jù)概述大綱 l=i-j+1;k=j; /局部最長平臺 i+; j=i; /新平臺起點(diǎn)printf(“最長平臺長度%d,在b數(shù)組中起始下標(biāo)為%d”,l,k);/ platform34、(1)p-rchild (2)p-lchild (3)p-lchild (4)addq(q,p-lchild) (5)addq(q,p-rchild)25.
41、 (1)t-rchild!=null (2)t-rchild!=null (3)n0+ (4)count(t-lchild) (5)count(t-rchild)26. .(1)top+ (2) stacktop=p-rchild (3)top+ (4)stacktop=p-lchild27. (1)*ppos / 根結(jié)點(diǎn) (2)rpos=ipos (3)rposipos (4)ipos (5)ppos+135、冒泡排序算法是把大的元素向上移(氣泡的上?。?,也可以把小的元素向下移(氣泡的下沉)請給出上浮和下沉過程交替的冒泡排序算法。48.有n個(gè)記錄存儲在帶頭結(jié)點(diǎn)的雙向鏈表中,現(xiàn)用雙向起泡排序法
42、對其按上升序進(jìn)行排序,請寫出這種排序的算法。(注:雙向起泡排序即相鄰兩趟排序向相反方向起泡)36、假設(shè)以鄰接矩陣作為圖的存儲結(jié)構(gòu),編寫算法判別在給定的有向圖中是否存在一個(gè)簡潔有向回路,若存在,則以頂點(diǎn)序列的方式輸出該回路(找到一條即可)。(注:圖中不存在頂點(diǎn)到自己的弧)有向圖推斷回路要比無向圖簡單。利用深度優(yōu)先遍歷,將頂點(diǎn)分成三類:未訪問;已訪問但其鄰接點(diǎn)未訪問完;已訪問且其鄰接點(diǎn)已訪問完。下面用0,1,2表示這三種狀態(tài)。前面已提到,若dfs(v)結(jié)束前消失頂點(diǎn)u到v的回邊,則圖中必有包含頂點(diǎn)v和u的回路。對應(yīng)程序中v的狀態(tài)為1,而u是正訪問的頂點(diǎn),若我們找出u的下一鄰接點(diǎn)的狀態(tài)為1,就可以輸
43、出回路了。void print(int v,int start ) /輸出從頂點(diǎn)start開頭的回路。for(i=1;i=n;i+)if(gvi!=0 visitedi=1 ) /若存在邊(v,i),且頂點(diǎn)i的狀態(tài)為1。printf(“%d”,v);if(i=start) printf(“n”); else print(i,start);break;/if/printvoid dfs(int v)visitedv=1;for(j=1;j=n;j+ )if (gvj!=0) /存在邊(v,j)if (visitedj!=1) if (!visitedj) dfs(j); /ifelse cycl
44、e=1; print(j,j);visitedv=2;/dfsvoid find_cycle() /推斷是否有回路,有則輸出鄰接矩陣。visited數(shù)組為全局變量。for (i=1;i=n;i+) visitedi=0;for (i=1;i=n;i+ ) if (!visitedi) dfs(i);/find_cycle37、題目中要求矩陣兩行元素的平均值按遞增挨次排序,由于每行元素個(gè)數(shù)相等,按平均值排列與按每行元素之和排列是一個(gè)意思。所以應(yīng)先求出各行元素之和,放入一維數(shù)組中,然后選擇一種排序方法,對該數(shù)組進(jìn)行排序,留意在排序時(shí)若有元素移動,則與之相應(yīng)的行中各元素也必需做相應(yīng)變動。void t
45、ranslation(float *matrix,int n)/本算法對nn的矩陣matrix,通過行變換,使其各行元素的平均值按遞增排列。int i,j,k,l;float sum 2021年青海省數(shù)據(jù)概述大綱 ,min; /sum暫存各行元素之和 float *p, *pi, *pk;for(i=0; in; i+)sum=0.0; pk=matrix+i*n; /pk指向矩陣各行第1個(gè)元素.for (j=0; jn; j+)sum+=*(pk); pk+; /求一行元素之和.*(p+i)=sum; /將一行元素之和存入一維數(shù)組./for ifor(i=0; in-1; i+) /用選擇法
46、對數(shù)組p進(jìn)行排序min=*(p+i); k=i; /初始設(shè)第i行元素之和最小.for(j=i+1;jn;j+) if(pjmin) k=j; min=pj; /記新的最小值及行號.if(i!=k) /若最小行不是當(dāng)前行,要進(jìn)行交換(行元素及行元素之和)pk=matrix+n*k; /pk指向第k行第1個(gè)元素.pi=matrix+n*i; /pi指向第i行第1個(gè)元素.for(j=0;jn;j+) /交換兩行中對應(yīng)元素.sum=*(pk+j); *(pk+j)=*(pi+j); *(pi+j)=sum;sum=pi; pi=pk; pk=sum; /交換一維數(shù)組中元素之和./if/for ifre
47、e(p); /釋放p數(shù)組./ translation算法分析 算法中使用選擇法排序,比較次數(shù)較多,但數(shù)據(jù)交換(移動)較少.若用其它排序方法,雖可削減比較次數(shù),但數(shù)據(jù)移動會增多.算法時(shí)間簡單度為o(n2).38、在有向圖g中,假如r到g中的每個(gè)結(jié)點(diǎn)都有路徑可達(dá),則稱結(jié)點(diǎn)r為g的根結(jié)點(diǎn)。編寫一個(gè)算法完成下列功能:(1)建立有向圖g的鄰接表存儲結(jié)構(gòu);(2)推斷有向圖g是否有根,若有,則打印出全部根結(jié)點(diǎn)的值。39、設(shè)一組有序的記錄關(guān)鍵字序列為(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求計(jì)算出查找關(guān)鍵字62時(shí)的比較次數(shù)并計(jì)算出查找勝利時(shí)的平均查找長度。40、對一般二
48、叉樹,僅依據(jù)一個(gè)先序、中序、后序遍歷,不能確定另一個(gè)遍歷序列。但對于滿二叉樹,任一結(jié)點(diǎn)的左右子樹均含有數(shù)量相等的結(jié)點(diǎn),依據(jù)此性質(zhì),可將任一遍歷序列轉(zhuǎn)為另一遍歷序列(即任一遍歷序列均可確定一棵二叉樹)。void pretopost(elemtype pre ,post,int l1,h1,l2,h2)/將滿二叉樹的先序序列轉(zhuǎn)為后序序列,l1,h1,l2,h2是序列初始和最終結(jié)點(diǎn)的下標(biāo)。if(h1=l1)posth2=prel1; /根結(jié)點(diǎn)half=(h1-l1)/2; /左或右子樹的結(jié)點(diǎn)數(shù)pretopost(pre,post,l1+1,l1+half,l2,l2+half-1) /將左子樹先序序
49、列轉(zhuǎn)為后序序列pretopost(pre,post,l1+half+1,h1,l2+half,h2-1) /將右子樹先序序列轉(zhuǎn)為后序序列 /pretopost32. .葉子結(jié)點(diǎn)只有在遍歷中才能知道,這里使用中序遞歸遍歷。設(shè)置前驅(qū)結(jié)點(diǎn)指針pre,初始為空。第一個(gè)葉子結(jié)點(diǎn)由指針head指向,遍歷到葉子結(jié)點(diǎn)時(shí),就將它前驅(qū)的rchild指針指向它,最終葉子結(jié)點(diǎn)的rchild為空。linkedlist head,pre=null; /全局變量linkedlist inorder(bitree bt)/中序遍歷二叉樹bt,將葉子結(jié)點(diǎn)從左到右鏈成一個(gè)單鏈表,表頭指針為headif(bt)inorder(bt
50、-lchild); /中序遍歷左子樹if(bt-lchi 2021年青海省數(shù)據(jù)概述大綱 ld=null bt-rchild=null) /葉子結(jié)點(diǎn) if(pre=null) head=bt; pre=bt; /處理第一個(gè)葉子結(jié)點(diǎn)elsepre-rchild=bt; pre=bt; /將葉子結(jié)點(diǎn)鏈入鏈表inorder(bt-rchild); /中序遍歷左子樹pre-rchild=null; /設(shè)置鏈表尾return(head); /inorder時(shí)間簡單度為o(n),幫助變量使用head和pre,??臻g簡單度o(n)41、矩陣中元素按行和按列都已排序,要求查找時(shí)間簡單度為o(m+n),因此不能采
51、納常規(guī)的二層循環(huán)的查找??梢韵葟挠疑辖牵╥=a,j=d)元素與x比較,只有三種狀況:一是ai,jx, 這狀況下向j 小的方向連續(xù)查找;二是ai,jx,下步應(yīng)向i大的方向查找;三是ai,j=x,查找勝利。否則,若下標(biāo)已超出范圍,則查找失敗。void search(datatype a , int a,b,c,d, datatype x)/n*m矩陣a,行下標(biāo)從a到b,列下標(biāo)從c到d,本算法查找x是否在矩陣a中.i=a; j=d; flag=0; /flag是勝利查到x的標(biāo)志while(i=b j=c)if(aij=x) flag=1;break;else if (aijx) j-; else i+;if(flag) printf(“a%d%d=%d”,i,j,x); /假定x為整型.else printf(“矩陣a中無%d 元素”,x);算法search結(jié)束。算法爭論算法中查找x的路線從右上角開頭,向下(當(dāng)xai,j)或向左(當(dāng)xai,j)。向下最多是m,向左最多是n。最佳狀況是在右上角比較一次勝利,最差是在左下角(ab,c),比較m+n次,故算法最差時(shí)間簡單度是o(m+n)。42
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度新能源儲能項(xiàng)目農(nóng)民工勞務(wù)合同規(guī)范4篇
- 二零二五版年薪制勞動合同:大數(shù)據(jù)分析行業(yè)專家協(xié)議4篇
- 2025年度農(nóng)行房貸利率調(diào)整專項(xiàng)合同書2篇
- 二零二五白蟻滅治與老舊建筑改造服務(wù)合同3篇
- 二零二五年度建筑工程合同履行補(bǔ)充協(xié)議范本3篇
- 個(gè)人承包旅游景區(qū)開發(fā)與經(jīng)營合同(2024版)3篇
- 二零二五年度節(jié)能環(huán)保門窗定制采購合同2篇
- 二手住宅買賣合同(2024版)范例2篇
- 二零二五版木托盤租賃與物流信息化建設(shè)合同4篇
- 管理決策知到智慧樹章節(jié)測試課后答案2024年秋山西財(cái)經(jīng)大學(xué)
- 壞死性筋膜炎
- 2024輸血相關(guān)知識培訓(xùn)
- 整式的加減單元測試題6套
- 股權(quán)架構(gòu)完整
- 山東省泰安市2022年初中學(xué)業(yè)水平考試生物試題
- 注塑部質(zhì)量控制標(biāo)準(zhǔn)全套
- 人教A版高中數(shù)學(xué)選擇性必修第一冊第二章直線和圓的方程-經(jīng)典例題及配套練習(xí)題含答案解析
- 銀行網(wǎng)點(diǎn)服務(wù)禮儀標(biāo)準(zhǔn)培訓(xùn)課件
- 二年級下冊數(shù)學(xué)教案 -《數(shù)一數(shù)(二)》 北師大版
- 晶體三極管資料
- 銀行內(nèi)部舉報(bào)管理規(guī)定
評論
0/150
提交評論