北京理工大學-資料結構期末考試試題(二)
資料結構試卷(二)
一、選擇題(24分)
1.下面關於線性表的敘述錯誤的是( )。
(A) 線性表採用順序儲存必須佔用一片連續的儲存空間
(B) 線性表採用鏈式儲存不必佔用一片連續的儲存空間
(C) 線性表採用鏈式儲存便於插入和刪除操作的實現
(D) 線性表採用順序儲存便於插入和刪除操作的實現
2.設哈夫曼樹中的葉子結點總數為m,若用二叉連結串列作為儲存結構,則該哈夫曼樹中總共有( )個空指標域。
(A)2m-1 (B) 2m (C) 2m+1 (D) 4m
3.設順序迴圈佇列Q[0:M-1]的頭指標和尾指標分別為F和R,頭指標F總是指向隊頭元素的前一位置,尾指標R總是指向隊尾元素的當前位置,則該迴圈佇列中的元素個數為( )。
(A)R-F (B) F-R (C) (R-F+M)%M (D) (F-R+M)%M
4.設某棵二叉樹的中序遍歷序列為ABCD,前序遍歷序列為CABD,則後序遍歷該二叉樹得到序列為( )。
(A)BADC (B) BCDA (C) CDAB (D) CBDA
5.設某完全無向圖中有n個頂點,則該完全無向圖中有( )條邊。
(A)n(n-1)/2 (B) n(n-1) (C) n2
6.設某棵二叉樹中有2000個結點,則該二叉樹的最小高度為( )。
(A)9 (B) 10 (C) 11 (D) 12
7.設某有向圖中有n個頂點,則該有向圖對應的鄰接表中有( )個表頭結點。
(A)n-1 (B) n (C) n+1 (D) 2n-1
8.設一組初始記錄關鍵字序列(5,2,6,3,8),以第一個記錄關鍵字5為基準進行一趟快速排序的結果為( )。
(A)2,3,5,8,6 (B)3,2,5,8,6
(C)3,2,5,6,8 (D)2,3,6,5,8
二、填空題(24分)
1. 為了能有效地應用HASH查詢技術,必須解決的兩個問題是____________________和__________________________。
2. 下面程式段的功能實現資料x進棧,要求在下劃線處填上正確的語句。
typedefstruct {int s[100]; int top;} sqstack;
voidpush(sqstack &stack,int x)
{
if(stack.top==m-1) printf(“overflow”);
else{____________________;_________________;}
}
3. 中序遍歷二叉排序樹所得到的序列是___________序列(填有序或無序)。
4. 快速排序的最壞時間複雜度為___________,平均時間複雜度為__________。
5. 設某棵二叉樹中度數為0的結點數為N0,度數為1的結點數為N1,則該二叉樹中度數為2的結點數為_________;若採用二叉連結串列作為該二叉樹的儲存結構,則該二叉樹中共有_______個空指標域。
6. 設某無向圖中頂點數和邊數分別為n和e,所有頂點的度數之和為d,則e=_______。
7. 設一組初始記錄關鍵字序列為(55,63,44,38,75,80,31,56),則利用篩選法建立的初始堆為___________________________。
8. 已知一有向圖的鄰接表儲存結構如下:從頂點1出發,DFS遍歷的輸出序列是
,BFS遍歷的輸出序列是
三 應用題(36分)
1. 設一組初始記錄關鍵字序列為(45,80,48,40,22,78),則分別給出第4趟簡單選擇排序和第4趟直接插入排序後的結果。
2. 設指標變數p指向雙向連結串列中結點A,指標變數q指向被插入結點B,要求給出在結點A的後面插入結點B的操作序列(設雙向連結串列中結點的兩個指標域分別為llink和rlink)。
3. 設一組有序的記錄關鍵字序列為(13,18,24,35,47,50,62,83,90),查詢方法用二分查詢,要求計算出查詢關鍵字62時的比較次數並計算出查詢成功時的平均查詢長度。
4. 設一棵樹T中邊的集合為{(A,B),(A,C),(A,D),(B,E),(C,F),(C,G)},要求用孩子兄弟表示法(二叉連結串列)表示出該樹的儲存結構並將該樹轉化成對應的二叉樹。
5. 設有無向圖G,要求給出用普里姆演算法構造最小生成樹所走過的邊的集合。
6. 設有一組初始記錄關鍵字為(45,80,48,40,22,78),要求構造一棵二叉排序樹並給出構造過程。
四、演算法設計題(16分)
1. 設有一組初始記錄關鍵字序列(K1,K2,…,Kn),要求設計一個演算法能夠在O(n)的時間複雜度內將線性表劃分成兩部分,其中左半部分的每個關鍵字均小於Ki,右半部分的每個關鍵字均大於等於Ki。
2. 設有兩個集合A和集合B,要求設計生成集合C=A∩B的演算法,其中集合A、B和C用鏈式儲存結構表示。
參考答案
一、選擇題
1.D 2.B 3.C 4.A 5.A 6.C 7.B 8.C
二、填空題
1. 構造一個好的HASH函式,確定解決衝突的方法
2. stack.top++,stack.s[stack.top]=x
3. 有序
4. O(n2),O(nlog2n)
5. N0-1,2N0+N1
6. d/2
7. (31,38,54,56,75,80,55,63)
8. (1,3,4,5,2),(1,3,2,4,5)
三、應用題
1. (22,40,45,48,80,78),(40,45,48,80,22,78)
2. q->llink=p;q->rlink=p->rlink; p->rlink->llink=q; p->rlink=q;
3. 2,ASL=91*1+2*2+3*4+4*2)=25/9
4. 樹的鏈式儲存結構略,二叉樹略
5. E={(1,3),(1,2),(3,5),(5,6),(6,4)}
6. 略
四、演算法設計題
1. 設有一組初始記錄關鍵字序列(K1,K2,…,Kn),要求設計一個演算法能夠在O(n)的時間複雜度內將線性表劃分成兩部分,其中左半部分的每個關鍵字均小於Ki,右半部分的每個關鍵字均大於等於Ki。
void quickpass(int r[], int s,int t)
{
int i=s, j=t, x=r[s];
while(i<j){
while (i<j &&r[j]>x) j=j-1; if (i<j) {r[i]=r[j];i=i+1;}
while (i<j && r[i]<x) i=i+1;if (i<j) {r[j]=r[i];j=j-1;}
}
r[i]=x;
}
2. 設有兩個集合A和集合B,要求設計生成集合C=A∩B的演算法,其中集合A、B和C用鏈式儲存結構表示。
typedef struct node {int data;struct node *next;}lklist;
void intersection(lklist*ha,lklist *hb,lklist *&hc)
{
lklist *p,*q,*t;
for(p=ha,hc=0;p!=0;p=p->next)
{ for(q=hb;q!=0;q=q->next) if (q->data==p->data) break;
if(q!=0){ t=(lklist*)malloc(sizeof(lklist)); t->data=p->data;t->next=hc; hc=t;}
}
}