個人記錄 錯題
采用平方探測沖突解決策略(hi(k)=(H(k)+i2)%11, 注意:不是±i2),將一批散列值均等於2的對象連續插入一個大小為11的散列表中,那么第4個對象一定位於下標為0的位置。(2分) T
n!是O(nn)的。(2分) T
對一棵平衡二叉樹,所有非葉結點的平衡因子都是0,當且僅當該樹是完全二叉樹。 (2分) F
對N個不同的數據采用冒泡排序進行從大到小的排序,當元素基本有序時交換元素次數肯定最多。 (2分) F
在一個有向圖中,所有頂點的入度與出度之和等於所有邊之和的2倍。(2分) T
單選題(22)
給定初始待排序列{ 15,9,7,8,20,-1,4 }。如果希爾排序第一趟結束后得到序列為{ 15,-1,4,8,20,9,7 },則該趟增量為: (4分) B.4
A.2 B.4 C.1 D.3
如果循環隊列用大小為m
的數組表示,隊頭位置為front
、隊列元素個數為size
,那么隊尾元素位置rear
為:(2分) B. (front+size-1)%m
front+size-1
B.
(front+size-1)%m
C.
(front+size)%m D.front+size
設一個棧的輸入序列是1、2、3、4、5,則下列序列中,是棧的合法輸出序列的是? (4分) D.3 2 1 5 4
A. 4 3 1 2 5 B.4 5 1 3 2 C.5 1 2 3 4 D.3 2 1 5 4
數據結構中Dijkstra算法用來解決哪個問題?(2分) A.最短路徑
設最小堆(小根堆)的層序遍歷結果為{5, 18, 15, 28, 22, 42, 40}。用線性時間復雜度的算法將該堆調整為最大堆(大根堆),則該樹的中序遍歷結果為:(4分) A.18, 28, 22, 42, 15, 40, 5
A.18, 28, 22, 42, 15, 40, 5 B.5, 22, 18, 42, 15, 40, 28 C.18, 28, 22, 15, 40, 5, 42 D.22, 5, 18, 42, 40, 15, 28
在拓撲排序算法中用堆棧和用隊列產生的結果會不同嗎?(2分) C.有可能會不同
A.是的肯定不同 B.以上全不對 C.有可能會不同 D.肯定是相同的
要判斷一個整數N(>10)是否素數,我們需要檢查3到√N之間是否存在奇數可以整除N。則這個算法的時間復雜度是:(2分) A. O(√N)
給定輸入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函數 h(X)=X%10。如果用大小為10的散列表,並且用線性探測解決沖突,則輸入各項經散列后在表中的下標為:(-1表示相應的插入無法成功)(4分) B. 1, 3, 4, 9, 5, 0, 2
設數字 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 在大小為10的散列表中根據散列函數 h(X)=X%10得到的下標對應為 {1, 3, 4, 9, 5, 0, 2}。那么繼續用散列函數 “h(X)=X%表長”實施再散列並用線性探測法解決沖突后,它們的下標變為:(4分) D.
下列敘述錯誤的是()。(2分) A.當一棵具有n 個葉子結點的二叉樹的WPL 值為最小時,稱其樹為哈夫曼樹,其二叉樹的形狀是唯一的
給定一有向圖的鄰接表如下。若從v1開始利用此鄰接表做廣度優先搜索得到的頂點序列為:{v1, v3, v2, v4, v5},則該鄰接表中順序填空的結果應為:(2分)
將 8, 9, 7, 2, 3, 5, 6, 4 順序插入一棵初始為空的AVL樹。下列句子中哪句是錯的?(4分) D.5 是 8 的父結點
A.7 是根結點
試利用Floyed算法,求下圖所示有向圖的各對頂點之間的最短路徑。下列選項哪個給出了正確的最短路徑長度矩陣和最短路徑矩陣?(4分) B

對給定序列{ 110,119,7,911,114,120,122 }采用次位優先(LSD)的基數排序,則兩趟收集后的結果為:(2分) B.7, 110, 911, 114, 119, 120, 122
給定有權無向圖的鄰接矩陣如下,其最小生成樹的總權重是:(4分) C.14
將1~6這6個鍵值插到一棵初始為空的二叉搜索樹中。如果插入完成后,搜索樹結構如圖所示,問:可能的插入序列是什么?(2分)
給定二叉樹如下圖所示。設N代表二叉樹的根,L代表根結點的左子樹,R代表根結點的右子樹。若遍歷后的結點序列為3、1、7、5、6、2、4,則其遍歷方式是:(2分) C.RNL
將 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐個按順序插入到初始為空的最小堆中,然后連續執行兩次刪除最小元素操作(DeleteMin),再插入4,16,此后堆頂的元素是什么?(4分) A.4
在並查集問題中,已知集合元素0~8所以對應的父結點編號值分別是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示樹根且對應集合大小為n),那么將元素6和8所在的集合合並(要求必須將小集合並到大集合)后,該集合對應的樹根和父結點編號值分別是多少?(4分) C. 4和-5
設棧S和隊列Q的初始狀態均為空,元素{1, 2, 3, 4, 5, 6, 7}依次進入棧S。若每個元素出棧后立即進入隊列Q,且7個元素出隊的順序是{2, 5, 6, 4, 7, 3, 1},則棧S的容量至少是:(2分) B. 4
A.1
在圖中自d點開始進行深度優先遍歷算法可能得到的結果為:(2分) A.d,e,a,c,f,b
A.d,e,a,c,f,b
對一組數據{ 2,12,16,88,5,10 }進行排序,若前三趟排序結果如下: 第一趟排序結果:2,12,16,5,10,88 第二趟排序結果:2,12,5,10,16,88 第三趟排序結果:2,5,10,12,16,88 則采用的排序方法可能是:(2分) B.冒泡排序
A.希爾排序
下列代碼的功能是對一個給定的圖G
執行拓撲排序,其中TopNum[]
從1開始記錄拓撲序。
void Topsort( Graph G ) { Queue Q; Vertex V, W; NodePtr ptr; int counter = 0; Q = CreateEmptyQueue(NumVertex); for ( V=0; V<G->NumV; V++ ) if ( Indegree[V] == 0 ) Enqueue(V, Q); while ( !IsEmpty(Q) ){ V = Dequeue( Q ); TopNum[V] = /*答題處1 (3分)*/; for ( ptr=G->List[V]; ptr; ptr=ptr->Next) { W = ptr->Vertex; if ( /*答題處2 (3分)*/== 0 ) Enqueue(W, Q); } } if ( counter != NumVertex ) printf("ERROR: Graph has a cycle.\n"); DisposeQueue(Q); }
答題處1. ++counter 2. --Indegree[W]
下列代碼的功能是將一列元素{ r[1] … r[n]
}按其鍵值 key
的非遞減順序排序。普通選擇排序是每次僅將一個待排序列的最小元放到正確的位置上,而這個另類的選擇排序是每次從待排序列中同時找到最小元和最大元,把它們放到最終的正確位置上。
void sort( list r[], int n ) { int i, j, mini, maxi; for (i=1; i<n-i+1; i++) { mini = maxi = i; for( j=i+1; /*答題處1 (3分)*/; ++j ){ if( /*答題處2 3分*/ ) mini = j; else if(r[j]->key > r[maxi]->key) maxi = j; } if( /*答題處3 (3分)*/ ) swap(&r[mini], &r[i]); if( maxi != n-i+1 ){ if( /*答題處4 (3分)*/ ) swap(&r[mini], &r[n-i+1]); else swap(&r[maxi], &r[n-i+1]); } } }
答題處1. j<=n 2. r[j]->key < r[mini]->key 3. mini!=i 4. 不知道
編程題
R7-1 根據后序和中序遍歷輸出先序遍歷
本題要求根據給定的一棵二叉樹的后序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
輸入格式:
第一行給出正整數N(≤30),是樹中結點的個數。隨后兩行,每行給出N個整數,分別對應后序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。
輸出格式:
在一行中輸出Preorder:
以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多余空格。
輸入樣例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
輸出樣例:
Preorder: 4 1 3 2 6 5 7
#include <iostream> #include <vector> using namespace std; void getPreOrder(int *postOrder,int *inOrder,int n){ if(n>0){ int root=postOrder[n-1]; int i=0; for(;i<n;i++){ if(inOrder[i]==root){ break; } } cout <<" "<< root; getPreOrder(postOrder,inOrder, i); getPreOrder(postOrder+i,inOrder+i+1, n-i-1); } } int main(){ int n,temp; cin >> n; int postOrder[30]; int inOrder[30]; for(int i=0;i<n;i++){ cin >> temp; postOrder[i]=temp; } for(int i=0;i<n;i++){ cin >> temp; inOrder[i]=temp; } cout <<"Preorder:"; getPreOrder(postOrder,inOrder,n); return 0; }
錯題
判斷題1-2 n! 是 O(n^n)的規模
選擇題
2-9 再散列並用線性探測解決沖突; 其中 再散列的key%(new n): 新的散列表表長new n= 表長n*2之后的第一個素數 ; 本題n=10 故2n之后的第一個素數為23 ; (數據結構黑皮書-再散列)
2-13 Floyed 最短路徑長度矩陣和最短路徑矩陣 直接連通-1, 不連通 0, 多步連通(下一跳的序號)
2-18 看清題目 刪除2個元素后還要再插入4 和16
5-2 第四空 腦子瓦特了