1、4、 void linklist_reverse(linklist &l)
//鍊錶的就地逆置;為簡化演算法,假設表長大於2
q->next=p;s->next=q;l->next=s;
}//linklist_reverse
2、假設以鄰接矩陣作為圖的儲存結構,編寫演算法判別在給定的有向圖中是否存在乙個簡單有向迴路,若存在,則以頂點序列的方式輸出該迴路(找到一條即可)。(注:圖中不存在頂點到自己的弧)
有向圖判斷迴路要比無向圖複雜。利用深度優先遍歷,將頂點分成三類:未訪問;已訪問但其鄰接點未訪問完;已訪問且其鄰接點已訪問完。
下面用0,1,2表示這三種狀態。前面已提到,若dfs(v)結束前出現頂點u到v的回邊,則圖中必有包含頂點v和u的迴路。對應程式中v的狀態為1,而u是正訪問的頂點,若我們找出u的下一鄰接點的狀態為1,就可以輸出迴路了。
void print(int v,int start ) //輸出從頂點start開始的迴路。
//if
void dfs(int v)
//if
else
visited[v]=2;
}//dfs
void find_cycle() //判斷是否有迴路,有則輸出鄰接矩陣。visited陣列為全域性變數。
//find_cycle
3、已知有向圖g=(v,e),其中v=,e=
寫出g的拓撲排序的結果。
g拓撲排序的結果是:v1、v2、v4、v3、v5、v6、v7
4、設有一組初始記錄關鍵字序列(k1,k2,…,kn),要求設計乙個演算法能夠在o(n)的時間複雜度內將線性表劃分成兩部分,其中左半部分的每個關鍵字均小於ki,右半部分的每個關鍵字均大於等於ki。
void quickpass(int r, int s, int t)
r[i]=x;
}5、請編寫乙個判別給定二叉樹是否為二叉排序樹的演算法,設二叉樹用llink-rlink法儲存。
6、假設以i和o分別表示入棧和出棧操作。棧的初態和終態均為空,入棧和出棧的操作序列可表示為僅由i和o組成的序列,稱可以操作的序列為合法序列,否則稱為非法序列。(15分)
(1)a和d是合法序列,b和c 是非法序列。
(2)設被判定的操作序列已存入一維
陣列a中。
int judge(char a)
//判斷字元陣列a中的輸入輸出序列是否是合法序列。如是,返回true,否則返回false。
}i++; //不論a[i]是『i』或『o』,指標i均後移。}
if(j!=k)
else
}//演算法結束。
7、已知有向圖g=(v,e),其中v=,e=
寫出g的拓撲排序的結果。
g拓撲排序的結果是:v1、v2、v4、v3、v5、v6、v7
8、陣列a和b的元素分別有序,欲將兩陣列合併到c陣列,使c仍有序,應將a和b拷貝到c,只要注意a和b陣列指標的使用,以及正確處理一陣列讀完資料後將另一陣列餘下元素複製到c中即可。
void union(int a,b,c,m,n)
//整型陣列a和b各有m和n個元素,前者遞增有序,後者遞減有序,本演算法將a和b歸併為遞增有序的陣列c。
演算法結束
4、要求二叉樹按二叉鍊錶形式儲存。15分
(1)寫乙個建立二叉樹的演算法。(2)寫乙個判別給定的二叉樹是否是完全二叉樹的演算法。
bitree creat建立二叉樹的二叉鍊錶形式的儲存結構
else error(「輸入錯誤」);
return(bt);
}//結束 bitree
int judgecomplete(bitree bt) //判斷二叉樹是否是完全二叉樹,如是,返回1,否則,返回0
//while
return 1; } //judgecomplete
9、 連通圖的生
生成樹包括圖中的全部n個頂點和足以使圖連通的n-1條邊,最小生成樹是邊上權值之和最小的生成樹。故可按權值從大到小對邊進行排序,然後從大到小將邊刪除。每刪除一條當前權值最大的邊後,就去測試圖是否仍連通,若不再連通,則將該邊恢復。
若仍連通,繼續向下刪;直到剩n-1條邊為止。
void spntree (adjlist g)
//用「破圈法」求解帶權連通無向圖的一棵最小代價生成樹。
node; //設頂點資訊就是頂點編號,權是整型數
node edge;
scanf( "%d%d",&e,&n) ; //輸入邊數和頂點數。
for (i=1;i<=e;i輸入e條邊:頂點,權值。
scanf("%d%d%d" ,&edge[i].i ,&edge[i].j ,&edge[i].w);
for (i=2;i<=e;i++) //按邊上的權值大小,對邊進行逆序排序。
//測試下一條邊edge[k],權值置0表示該邊被刪除
k++; //下條邊
}//while
}//演算法結束。
connect()是測試圖是否連通的函式,可用圖的遍歷實現,
10、設有乙個陣列中存放了乙個無序的關鍵序列k1、k2、…、kn。現要求將kn放在將元素排序後的正確位置上,試編寫實現該功能的演算法,要求比較關鍵字的次數不超過n。
51. 借助於快速排序的演算法思想,在一組無序的記錄中查詢給定關鍵字值等於key的記錄。設此組記錄存放於陣列r[l..
h]中。若查詢成功,則輸出該記錄在r陣列中的位置及其值,否則顯示「not find」資訊。請編寫出演算法並簡要說明演算法思想。
11、請設計乙個演算法,要求該演算法把二叉樹的葉子結點按從左到右的順序連成乙個單鏈表,表頭指標為head。 二叉樹按二叉鍊錶方式儲存,鏈結時用葉子結點的右指標域來存放單鏈表指標。分析你的演算法的時、空複雜度。
12、#define maxsize 棧空間容量void inouts(int s[maxsize])
//s是元素為整數的棧,本演算法進行入棧和退棧操作。
else s[++top]=x; //x入棧else //讀入的整數等於-1時退棧。
else printf(「出棧元素是%d\n」,s[top
演算法結13、設t是一棵滿二叉樹,編寫乙個將t的先序遍歷序列轉換為後序遍歷序列的遞迴演算法。
14、 將頂點放在兩個集合v1和v2。對每個頂點,檢查其和鄰接點是否在同乙個集合中,如是,則為非二部圖。為此,用整數1和2表示兩個集合。再用一佇列結構存放圖中訪問的頂點。
int bpgraph (adjmatrix g)
//判斷以鄰接矩陣表示的圖g是否是二部圖。
//初始化,各頂點未確定屬於那個集合
q[1]=1; r=1; s[1]=1;//頂點1放入集合s1
while(fnext)
}//pretopost
32. .葉子結點只有在遍歷中才能知道,這裡使用中序遞迴遍歷。
設定前驅結點指標pre,初始為空。第乙個葉子結點由指標head指向,遍歷到葉子結點時,就將它前驅的rchild指標指向它,最後葉子結點的rchild為空。
linkedlist head,pre=null; //全域性變數
linkedlist inorder(bitree bt)
//中序遍歷二叉樹bt,將葉子結點從左到右鏈成乙個單鏈表,表頭指標為head
//處理第乙個葉子結點
else //將葉子結點鏈入鍊錶
inorder(bt->rchild中序遍歷左子樹
pre->rchild=null設定鍊錶尾
}return(head); } //inorder
時間複雜度為o(n),輔助變數使用head和pre,棧空間複雜度o(n)
20、設一組有序的記錄關鍵字序列為(13,18,24,35,47,50,62,83,90),查詢方法用二分查詢,要求計算出查詢關鍵字62時的比較次數並計算出查詢成功時的平均查詢長度。
21、若第n件物品能放入揹包,則問題變為能否再從n-1件物品中選出若干件放入揹包(這時揹包可放入物品的重量變為s-w[n])。若第n件物品不能放入揹包,則考慮從n-1件物品選若干件放入揹包(這時揹包可放入物品仍為s)。若最終s=0,則有一解;否則,若s<0或雖然s>0但物品數n<1,則無解。
(1)s-w[n],n-1 //knap(s-w[n],n-1)=true
(2)s,n-1knap←knap(s,n-1)
22、請編寫乙個判別給定二叉樹是否為二叉排序樹的演算法,設二叉樹用llink-rlink法儲存。
2023年內蒙古自治區資料總結高階
1 設t是給定的一棵二叉樹,下面的遞迴程式count t 用於求得 二叉樹t中具有非空的左,右兩個兒子的結點個數n2 只有非空左兒子的個數nl 只有非空右兒子的結點個數nr和葉子結點個數n0。n2 nl nr n0都是全域性量,且在呼叫count t 之前都置為0.typedef struct no...
2023年內蒙古自治區資料總結入門
1 設有一組初始記錄關鍵字為 45,80,48,40,22,78 要求構造一棵二叉排序樹並給出構造過程。2 後序遍歷最後訪問根結點,即在遞迴演算法中,根是壓在棧底的。採用後序非遞迴演算法,棧中存放二叉樹結點的指標,當訪問到某結點時,棧中所有元素均為該結點的祖先。本題要找p和q 的最近共同祖先結點r ...
2023年內蒙古自治區資料總結摘要
1 對一般二叉樹,僅根據乙個先序 中序 後序遍歷,不能確定另乙個遍歷序列。但對於滿二叉樹,任一結點的左右子樹均含有數量相等的結點,根據此性質,可將任一遍歷序列轉為另一遍歷序列 即任一遍歷序列均可確定一棵二叉樹 void pretopost elemtype pre post,int l1,h1,l2...