[课程复习] 数据结构之经典题目回顾 (一)选择题、填空题1
作者最近在復習考博,乘此機會分享一些計算機科學與技術、軟件工程等相關專業課程考題,一方面分享給考研、考博、找工作的博友,另一方面也是自己今后完成這些課程的復習資料,同時也是在線筆記。基礎知識,希望對您有所幫助,不喜勿噴~
文章目錄
- 一.基礎、棧和隊列
- 二.數組和廣義表
- 三.樹和二叉樹
- 四.圖
- 五.查找
- 六.排序
一.基礎、棧和隊列
1、棧和隊列的共同特點是: 只允許在端點出插入和刪除元素 。
2、用鏈接方式存儲的隊列,在進行插入運算時( D )。
- A. 僅修改頭指針
- B. 頭、尾指針都要修改
- C. 僅修改尾指針
- D.頭、尾指針可能都要修改
3、通常從四個方面評價算法的質量:(可讀性)、(正確性)、(健壯性)和(高效性)。
4、設順序循環隊列Q[0:M-1]的頭指針和尾指針分別為F和R,頭指針F總是指向隊頭元素的前一位置,尾指針R總是指向隊尾元素的當前位置,則該循環隊列中的元素個數為:(R-F+M)%M。
5、下面程序段的功能實現數據x進棧,要求在下劃線處填上正確的語句。
typedef struct {int s[100]; int top;} sqstack; void push(sqstack &stack,int x) {if (stack.top==m-1) printf(“overflow”);else {____________________; _________________;} }答案:stack.top++,stack.s[stack.top]=x
6、中序遍歷二叉排序樹所得到的序列是___________序列(填有序或無序)。
解析:二叉排序樹的性質: 按中序遍歷二叉排序樹,所得到的中序遍歷序列是一個遞增有序序列。
7、設指針變量p指向單鏈表中結點A,若刪除單鏈表中結點A,則需要修改指針的操作序列為( )。
A.q=p->next;p->data=q->data;p->next=q->next;free(q);
B.q=p->next;q->data=p->data;p->next=q->next;free(q);
C.q=p->next;p->next=q->next;free(q);
D.q=p->next;p->data=q->data;free(q);
解析:此題參考 ??途W 下面這位大神的回答,答案選A,此題不是很好,刪除過程通常是不需要賦值data的。
8、數據的物理結構主要包括_____________和______________兩種情況。
答案:順序存儲結構、鏈式存儲結構
9、設輸入序列為1、2、3,則經過棧的作用后可以得到___________種不同的輸出序列。
解析:
卡特蘭數,C=(2n)!/(n+1)!n!=6!/4!3!=65/32=5
321、123、132、213、231,答案為5種。
10、不論是順序存儲結構的棧還是鏈式存儲結構的棧,其入棧和出棧操作的時間復雜度均為____________。
答案:O(1)
11、設用鏈表作為棧的存儲結構則退棧操作 ( )。
答案:必須判別棧是否為空
12、設指針變量p指向雙向循環鏈表中的結點X,則刪除結點X需要執行的語句序列為_____________________(設結點中的兩個指針域分別為llink和rlink)。
答案:p>llink->rlink=p->rlink; p->rlink->llink=p->rlink
13、設有一個順序循環隊列中有M個存儲單元,則該循環隊列中最多能夠存儲________個隊列元素;當前實際存儲________________個隊列元素(設頭指針F指向當前隊頭元素的前一個位置,尾指針指向當前隊尾元素的位置)。
答案:M-1,(R-F+M)%M
14、設順序線性表中有n個數據元素,則第i個位置上插入一個數據元素需要移動表中_______個數據元素;刪除第i個位置上的數據元素需要移動表中_______個元素。
答案:n+1-i,n-i。
建議畫圖舉例解析
二.數組和廣義表
1、設有一個二維數組A[m][n],假設A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每個元素占一個空間,問A[3][3]存放在什么位置?腳注(10)表示用10進制表示。
- A.688
- B.678
- C.692
- D.696
解析:
計算公式A[i][j]:A[0][0]+nj+i;
644 + 2 * n + 2 = 676,則計算出:n=15。A[3][3]=644+3*15+3=692。答案選C。
2、假定一棵樹的廣義表表示為A(C,D(E,F,G),H(I,J)),則樹中所含的結點數為_________個,樹的深度為___________,樹的度為_________。
解析:
樹的度為樹內各節點的度的最大值,故答案為:9、3、3。
3、設一維數組中有n個數組元素,則讀取第i個數組元素的平均時間復雜度為( )。
答案: O(1)
三.樹和二叉樹
1、二叉樹的第k層的結點數最多為: 2k-1 。
2、后綴算式9 2 3 ± 10 2 / - 的值為__________。中綴算式(3+4X)-2Y/3對應的后綴算式為______________________。
答案:3, 4 X * + 2 Y * 3 / -
3、若用鏈表存儲一棵二叉樹時,每個結點除數據域外,還有指向左孩子和右孩子的兩個指針。在這種存儲結構中,n個結點的二叉樹共有________個指針域,其中有________個指針域是存放了地址,有______個指針是空指針。
答案:2n n-1 n+1
4、向一棵B_樹插入元素的過程中,若最終引起樹根結點的分裂,則新樹比原樹的高度___________。
答案:增加1
5、設哈夫曼樹中的葉子結點總數為m,若用二叉鏈表作為存儲結構,則該哈夫曼樹中總共有(2m )個空指針域。
解析:哈夫曼樹中只有N0和N2節點,如果用二叉鏈表來存儲,度為2的結點的左右孩子都存在,沒有空指針,度為0的葉子沒有孩子,因此左右孩子的鏈域都為空,因此該Huffman樹一共有2m個空指針。
6、設某棵二叉樹的中序遍歷序列為ABCD,前序遍歷序列為CABD,則后序遍歷該二叉樹得到序列為( )。
解析:通過中序遍歷和前序遍歷可以將樹構建出來,再求其后序遍歷結果。
前序遍歷(先根排序),故C為根節點,再看中序遍歷可知,AB為C的左子樹,D為其右子樹。AB - C - D
前序遍歷第二個節點為A,則A為根節點,再看中序遍歷B在A后面,則B為右子樹,最終構建樹如下圖所示。
答案:后序遍歷結果為 BADC。
7、設某棵二叉樹中有2000個結點,則該二叉樹的最小高度為( )。
解析:
滿二叉樹高度與節點個數關系是num=2n-1,則:210 < 2000 < 211。答案為:11
8、設某棵二叉樹中度數為0的結點數為N0,度數為1的結點數為N1,則該二叉樹中度數為2的結點數為_________;若采用二叉鏈表作為該二叉樹的存儲結構,則該二叉樹中共有_______個空指針域。
答案:N0-1,2N0+N1
二叉樹中N2+1=N0,其中空指針為二叉樹N0節點2個,N1節點1個。
建議該種題型畫圖進行分析,如下所示:葉子節點4個,N2節點3個。
9、設某數據結構的二元組形式表示為A=(D,R),D={01,02,03,04,05,06,07,08,09},R={r},r={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,07>,<03,08>,<03,09>},則數據結構A是(樹型結構 )。
解析:畫圖即可展示。
10、設一棵完全二叉樹中有500個結點,則該二叉樹的深度為__________;若用二叉鏈表作為該完全二叉樹的存儲結構,則共有___________個空指針域。
答案:9、501
參考 ??途W 解析:
或者將二叉樹中節點從1到500編號,最后一個節點500對應的最后一個雙親節點編號為500/2=250,故有250個葉子節點。又500的雙親節點右孩子節點應該為2*250+1=501,無右孩子節點,故右指針域為空,共501個空指針域。
11、設哈夫曼樹中共有n個結點,則該哈夫曼樹中有________個度數為1的結點。
答案:0
12、設有n個結點的完全二叉樹,如果按照從自上到下、從左到右從1開始順序編號,則第i個結點的雙親結點編號為____________,右孩子結點的編號為___________。
答案:i/2,2i+1
13、下列算法實現在二叉排序樹上查找關鍵值k,請在下劃線處填上正確的語句。
typedef struct node{int key; struct node *lchild; struct node *rchild;}bitree; bitree *bstsearch(bitree *t, int k) { if (t==0 ) return(0);else while (t!=0)if (t->key==k) _____________; else if (t->key>k) t=t->lchild; else _____________; }答案:return(t),t=t->rchild
14、設一棵二叉樹的深度為k,則該二叉樹中最多有( )個結點。
答案:2k-1
15、在二叉排序樹中插入一個結點的時間復雜度為( )。
答案:O(n)
最差情況下是O(n) 如果是最一般最基礎的二叉樹的話, 因為深度不平衡,所以會發展成單鏈的形狀,就是一條線 n個點那么深,如果是深度平衡的二叉樹 o(logn)。
16、根據初始關鍵字序列(19,22,01,38,10)建立的二叉排序樹的高度為____________。
答案:3
17、深度為k的完全二叉樹中最少有____________個結點,最多有__________個結點。
答案:2k-1,2k-1
完全二叉樹是一對一對應,和滿二叉樹有區別,滿二叉樹為最多結點,最少如下所示,僅4個結點。
18、設哈夫曼樹中共有99個結點,則該樹中有_________個葉子結點;若采用二叉鏈表作為存儲結構,則該樹中有_____個空指針域。
解析:
哈夫曼樹沒有N1節點,故:99=N0+N2,并且N0=N2+1,求得:N2=49,故葉子節點為50個;二空指針為葉子節點的左右孩子指針,共100個空指針。
答案:50,100
四.圖
1、對于一個具有n個頂點和e條邊的有向圖和無向圖,在其對應的鄰接表中,所含邊結點分別有_______個和________個。
答案:e,2e
2、AOV網是一種 有向無回路 的圖。DAG圖稱為 有向無環圖 。
3、在一個具有n個頂點的無向完全圖中,包含有________條邊,在一個具有n個頂點的有向完全圖中,包含有________條邊。
解析:答案為:n(n-1)/2,n(n-1)。
例如,n=4,則有6個頂點。
4、設某有向圖中有n個頂點,則該有向圖對應的鄰接表中有( )個表頭結點。
答案:n
5、設某無向圖中頂點數和邊數分別為n和e,所有頂點的度數之和為d,則e=_______。
答案:d/2
6、已知一有向圖的鄰接表存儲結構如下:從頂點1出發,DFS遍歷的輸出序列是______________,BFS遍歷的輸出序列是_____________。
解析:
DFS是深度優先搜索,則從頂點1出發,搜索3,3繼續搜索4,4鄰接頂點為空,則返回上一層3搜索5,5繼續搜索2,故輸出:1->3->4->5->2
BFS是廣度優先搜索,則頂點1出發,搜索3、2、4,接著搜索3的頂點5,故輸出:1->3->2->4->5
答案:(1,3,4,5,2),(1,3,2,4,5)
注意下圖需按照鄰接表指針順序遍歷,1先遍歷3,才到其他的。
7、設無向圖G中有n個頂點e條邊,則其對應的鄰接表中的表頭結點和表結點的個數分別為( )。
答案:n,2e
8、設某強連通圖中有n個頂點,則該強連通圖中至少有( n )條邊。
解析:參考百度百科 oncforever大神 的答案。
有n個頂點的強連通圖最多有n(n-1)條邊,最少有n條邊。
解釋如下:
強連通圖(Strongly Connected Graph)是指一個有向圖(Directed Graph)中任意兩點v1、v2間存在v1到v2的路徑(path)及v2到v1的路徑的圖。
最多的情況:
即n個頂點中兩兩相連,若不計方向,n個點兩兩相連有n(n-1)/2條邊,而由于強連通圖是有向圖,故每條邊有兩個方向,n(n-1)/2×2=n(n-1),故有n個頂點的強連通圖最多有n(n-1)條邊。
最少的情況:
即n個頂點圍成一個圈,且圈上各邊方向一致,即均為順時針或者逆時針,此時有n條邊。
舉例:如下圖ABCD四個點構成強連通圖
邊數最多有4×3=12條,邊數最少有4條,圖如下所示:
9、設有向圖G用鄰接矩陣A[n][n]作為存儲結構,則該鄰接矩陣中第i行上所有元素之和等于頂點i的________,第i列上所有元素之和等于頂點i的________。
答案:出度,入度
10、設有向圖G中有n個頂點e條有向邊,所有的頂點入度數之和為d,則e和d的關系為_________。
答案:e=d
11、設有向圖G中有向邊的集合E={<1,2>,<2,3>,<1,4>,<4,2>,<4,3>},則該圖的一種拓撲序列為____________________。
答案:1->4->2->3
五.查找
1、若有18個元素的有序表存放在一維數組A[19]中,第一個元素放A[1]中,現進行二分查找,則查找A[3]的比較序列的下標依次為( )。
- A. 1,2,3
- B. 9,5,2,3
- C. 9,5,3
- D. 9,4,2,3
解析:
mid = |(low+high)/2|,向下取整,如9.5取9。
第一次:left = 1 right = 18 ,則:mid = 9 (向下取整)
第二次:left = 1 right = 8(mid-1),則:mid = 4 (向下取整)
第三次:left = 1 right = 3(mid-1),則:mid = 2
第四次:left = 3 (mid+1) right = 3 mid = 3。答案選D。
2、假定一個線性表為(12,23,74,55,63,40),若按Key % 4條件進行劃分,使得同一余數的元素成為一個子表,則得到的四個子表分別為 (12 , 40 )、(23,55, 63)、(74)和( )。
解析:
余數為0:12%4=0, 40%4=0
余數為2:74%4=2
余數為3:23%4=3, 55%4=3, 63%4=3
3、設一組有序的記錄關鍵字序列為(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求計算出查找關鍵字62時的比較次數并計算出查找成功時的平均查找長度。
解析:其計算過程如下圖所示。
答案:2,ASL = (1 * 1 + 2 * 2 + 3 * 4 + 4 * 2) / 9 = 25/9。
4、設二叉排序樹中有n個結點,則在二叉排序樹的平均查找長度為( )。
答案:O(log2n)
5、設查找表中有100個元素,如果用二分法查找方法查找數據元素X,則最多需要比較________次就可以斷定數據元素X是否在查找表中。
答案:7
解析:log2100=7,2的7次方為128。
6、下列算法實現在順序散列表中查找值為k的關鍵字,請在下劃線處填上正確的語句。
struct record{int key; int others;}; int hashsqsearch(struct record hashtable[ ],int k) {int i,j; j=i=k % p;while (hashtable[j].key!=k&&hashtable[j].flag!=0){j=(____) %m; if (i==j) return(-1);}if (_______________________ ) return(j); else return(-1); }答案:j+1,hashtable[j].key==k
由于返回 j 表示該下標的存儲的值為k,故第二個空為 hashtable[j].key==k。
7、設有序順序表中有n個數據元素,則利用二分查找法查找數據元素X的最多比較次數不超過( )。
A.log2n+1 B.log2n-1 C.log2n D.log2(n+1)
答案:A,折半查找為log2n+1(最后一個元素的比較)。
8、設散列函數H(k)=k mod p,解決沖突的方法為鏈地址法。要求在下列算法劃線處填上正確的語句完成在散列表hashtalbe中查找關鍵字值等于k的結點,成功時返回指向關鍵字的指針,不成功時返回標志0。
typedef struct node {int key; struct node *next;} lklist; void createlkhash(lklist *hashtable[ ]) {int i,k; lklist *s;for(i=0;i<m;i++) _____________________;for(i=0;i<n;i++){s=(lklist *)malloc(sizeof(lklist)); s->key=a[i];k=a[i] % p; s->next=hashtable[k]; _______________________;} }答案:hashtable[i]=0,hashtable[k]=s
六.排序
1、對n個記錄的文件進行快速排序,所需要的輔助存儲空間大致為:O(log2n)
解析:
輔助空間中快速排序為O(log2n),歸并排序為O(n),基數排序為O(rd+n),其他排序為O(1)。
2、在堆排序的過程中,對任一分支結點進行篩運算的時間復雜度為________,整個堆排序過程的時間復雜度為________。
解析:
堆排序的時間復雜度為O(nlog2n),則每個分支的時間復雜度為O(log2n)。
答案:O(log2n),O(nlog2n)。
3、在快速排序、堆排序、歸并排序中, 歸并 排序是穩定的。
解析:
穩定排序:直接插入排序、冒泡排序、歸并排序、基數排序
不穩定排序:希爾排序、直接選擇排序、堆排序、快速排序
4、設一組初始記錄關鍵字序列(5,2,6,3,8),以第一個記錄關鍵字5為基準進行一趟快速排序的結果為( 3,2,5,6,8 )。
解析:
快速排序5為基準,基本規則如下:left=3,right=8,先遍歷right,尋找比基準5小的數字左移;找到之后與左邊left下標替換,接著left向右移動,尋找比基準5大的數字,找到之后替換,最后left=right時,該數字與基準替換。
初始:5 2 6 3 8,right尋找到3,與left=5交換位置
接著:3 2 6 () 8,left從左邊移動,找到6,與()替換位置
接著:3 2 () 6 8,此時向左移動right,right=left,停止快速排序,并用()替換基準5。
輸出:3 2 5 6 8,其為第一趟快速排序的結果。
5、為了能有效地應用HASH查找技術,必須解決的兩個問題是____________和_________。
答案:構造一個好的HASH函數,確定解決沖突的方法。
6、快速排序的最壞時間復雜度為___________,平均時間復雜度為__________。
答案:O(n2),O(nlog2n)
7、設一組初始記錄關鍵字序列為(55,63,44,38,75,80,31,56),則利用篩選法建立的初始堆為___________________________。
答案:(31,38,54,56,75,80,55,63)
8、設有n個待排序的記錄關鍵字,則在堆排序中需要( 1 )個輔助記錄單元。
9、設一組初始關鍵字記錄關鍵字為(20,15,14,18,21,36,40,10),則以20為基準記錄的一趟快速排序結束后的結果為( )。
A.10,15,14,18,20,36,40,21
B.10,15,14,18,20,40,36,21
C.10,15,14,20,18,40,36,2l
D.10,15,14,18,20,36,40,21
解析:快排如下
20,15,14,18,21,36,40,10 => 右邊開始,找到小于20的10,交換次序
10, 15,14,18,21,36,40,() => 左邊繼續,找到大于20的21,交換次序
10,15,14,18,(),36,40,21 => 右邊繼續找小于20的數字,找到()處停止
10,15,14,18,20,36,40,21 => 輸出第一趟快速排序結果,故選D。
10、設有5000個待排序的記錄關鍵字,如果需要用最快的方法選出其中最小的10個記錄關鍵字,則用下列( 堆排序 )方法可以達到此目的。
11、設一組初始記錄關鍵字為(72,73,71,23,94,16,5),則以記錄關鍵字72為基準的一趟快速排序結果為___________________________。
答案:(5,16,71,23,72,94,73)
該題方法和前面一樣,請同學們自行嘗試。
72 73 71 23 94 16 05
05 73 71 23 94 16 ( )
05 ( ) 71 23 94 16 73
05 16 71 23 94 ( ) 73
05 16 71 23 ( ) 94 73
05 16 71 23 72 94 73
12、設一組初始記錄關鍵字序列為(345,253,674,924,627),則用基數排序需要進行( )趟的分配和回收才能使得初始關鍵字序列變成有序序列。
答案:3
個位、十位、百位共三趟。
13、設有n個無序的記錄關鍵字,則直接插入排序的時間復雜度為________,快速排序的平均時間復雜度為_________。
答案:O(n2),O(nlog2n)
14、設初始記錄關鍵字序列為(K1,K2,…,Kn),則用篩選法思想建堆必須從第______個元素開始進行篩選。
答案:n/2
15、設一組初始記錄關鍵字序列為(20,18,22,16,30,19),則以20為中軸的一趟快速排序結果為______________________________。
答案:(19,18,16,20,30,22)
16、設一組初始記錄關鍵字序列為(20,18,22,16,30,19),則根據這些初始關鍵字序列建成的初始堆為________________________。
答案:(16,18,19,20,30,22)
PS:最近參加CSDN2018年博客評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index
五年來寫了314篇博客,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、數據挖掘、網絡爬蟲、圖像處理、C#、Android等?,F在也當了兩年老師,更是覺得有義務教好每一個學生,讓貴州學子好好寫點代碼,學點技術,“師者,傳到授業解惑也”,提前祝大家新年快樂。2019我們攜手共進,為愛而生。
(By:Eastmount 2019-01-28 下午6點 http://blog.csdn.net/eastmount/ )
總結
以上是生活随笔為你收集整理的[课程复习] 数据结构之经典题目回顾 (一)选择题、填空题1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [知识图谱构建] 二.《Neo4j基础入
- 下一篇: [知识图谱实战篇] 一.数据抓取之Pyt