該回憶版由(492030260)群內小伙伴討論回憶出來的,我代為整理,除非搞到原題,任何考研機構不可能比我們這個更全,希望大家購買所謂真題的時候理性消費。
其中選擇的第4題,第12題,填空的第1題,比較有歧義,不保證回憶和答案的正確性。其他題目或者答案如果有問題,或者你回想起了其他的題目或者題目細節,歡迎在評論區寫出、群里@我或者直接私聊我。再次感謝!!!!
轉載請注明出處 :https://www.cnblogs.com/xuwangzihao/p/12081845.html
選擇題20個
1,給你入棧順序123,出棧順序231,問你操作序列。(push、push、pop、push、pop、pop)
2,下列哪個說法錯誤:
A 對稱矩陣的存儲只需要存主對角線和上三角或下三角
B 對角矩陣不用存儲零【對角線上可能有零】
C 稀疏矩陣可以用三元組
D 稀疏矩陣有分布規律,可以用三元組
3,給了一循環隊列A[0……30],rear指向隊尾元素,front指向隊頭元素的前一個位置,存儲了11個元素,當前front指向25,求rear指針位置。(5)
4,有一個無向圖,每個邊值不同,問下列哪一個選項是錯的。
A 生成樹不一定唯一
BC很簡單,不記得了。。。
D 兩節點的最短距離一定是最小生成樹上的兩節點最短距離
5,一個外層循環n,內層循環2n的程序,問你時間復雜度。(O(n^2))(注意不要選O(2n^2),漸進復雜度省略常數)
A O(2n) B O(n)
C O(2n^2) D O(n^2)
6,二維矩陣的壓縮方式:(答案應該是十字鏈表和三元組,不要選散列和鄰接表)
7,請選出排序算法的啟動時間最少的算法,所謂啟動時間就是說選出第一個元素的最終位置所花的時間。
A 歸並排序 B 堆排序
C 插入排序 D 快速排序
8,下列哪個空間復雜度不是常數:
A 歸並排序 B 堆排序
C 快速排序 D 置換-選擇排序
9,順序表下列哪個操作平均復雜度與眾不同。
A 刪除元素a B 查找元素a
C 求表長 D 在第i個元素后插入
10,給你一個圖,問你哪個dfs序是不可能的(簡單題,沒啥說的)
11,給你一個 [1..5, 1..5] 上三角矩陣,問你壓縮成一維后(下標從零開始),在行優先的情況下,a33的下標。(9)
12,關於m階b樹性質,下列哪個錯誤:(每個節點最少有2個子樹,注意根節點為葉子結點的情況)
A 每個節點最少有2個子樹
B 每個節點最多m-1關鍵字
C 葉節點都在同一層
D 記錄是有序的
13,中序線索二叉樹的后繼不可能是:
A 祖先 B 兄弟 C 右孩子的左子樹 D 兒子
14,問你抽象數據類型說法錯誤的是:(D 用戶可以看外面,也能清楚看到內部算法過程)
15,給你一個序列,問你折半查找某個不存在的數字的比較次數。(簡單題)
16,對於一個森林來說,以孩子兄弟表示法表示,那么對於森林中的葉子節點,在孩子兄弟表示法中應該是()
A 沒有左孩子 B 沒有右孩子
C 有左孩子,沒有右孩子 D 既沒有左孩子也沒有右孩子
17,n個節點的正則(完全)二叉樹,分支節點個數為?
A n/2 B (n-1)/2 C (n+1)/2 D n
18,給了四個序列問哪個不是折半查找的查找序列。(簡單題,只要保證搜索范圍在不斷縮小就行,比如目標是12,你之前已經比較過10和14了,這時候序列出來個8,那明顯就不是折半查找的查找序列了)
19,給了四個序列問哪個既不是大根堆,也不是小根堆。(簡單題,選項里有一個 83 82 84,83兩個孩子一大一小,那肯定錯了啊)
填空題15個題,20個空
1,給了一個hash函數和輸入序列,問你某一個值在表中的key是什么,問你平均查找長度。(這題第一問簡單,第二問。。。可能要把成功查找的平均值和不成功的平均值再求平均)
2,問你100個數字歸並排序需要幾趟(7)
3,給你前序中序求層次遍歷。(簡單題)
4,基數排序的步驟:(分配)和收集
5,給你一個序列,問步長為3的一趟希爾排序后是什么樣(簡單題)
6,5層(不含葉子結點層)3階B樹結點最多 121 個,最少 31 個。
7,在二叉搜索樹中刪除u,已知u的祖先是p,u只有左子樹s。操作是:p->lc=s,s->parent=p;然后釋放u的空間。
8,給你一個avl的插入序列(10,9,15,12,11),問你它旋轉后的樹的層次遍歷。(10,9,12,11,15)
9, 一個n個節點的完全二叉樹只有一個葉子結點的點是第幾個點。(n/2)
10,單鏈表中刪除q的后繼結點的操作(q->next=q->next->next)
11,給你一個hash函數x%7,和幾個數,問你能和48映射在同一位置的數字是(62)
12,廣義表((a),(((b)),c),(d)),求長度:3,深度:4,表頭:(a),表尾((((b)),c),(d)):
13,森林的后序遍歷是樹的 中 序遍歷
14,給你一個序列(1,2,3,4,5),問你折半查找數字2所用的比較次數為2次。
簡答題4個
1,給你中序和層次遍歷,讓你畫出那個樹,並寫出前續和中序。
簡單題,沒啥說的
2,已知L是單向循環鏈表,長度大於4,p1p2為指向其中兩個不同節點的指針,問你A程序的意思和復雜度。

1 void A(L, p1, p2){ 2 3 B(p1,p2); 4 5 B(p2,p1); 6 7 } 8 9 void B(LNode *s, LNode *e){ 10 11 LNode *p=s; 12 13 while(p->next!=e)p=p->next; 14 15 p->next = s; 16 17 }
A的功能是把循環鏈表L在p1和p1的前綴處切開、p2和p2的前綴處切開,分割成兩個單向循環鏈表。復雜度是O(n)
3,有兩個小問:
1,一個50個點,100條邊的無向圖,點信息20字節,邊信息10字節,鄰接信息4字節,n、m、type各8字節,用鄰接矩陣表示,問你存儲這個圖要花多少字節。
50*20+50*50*(10+4)+3*8
2,問你鄰接表存儲的無向圖求連通分量的復雜度分析。
時間復雜度:O(n+e)。因為要DFS每一個節點,且每個邊都訪問一遍。
空間復雜度:O(n)。因為要開染色標記的輔助數組,如果DFS是遞歸實現,還要用深度為n的系統棧。
4,給你14個帶權重的字母,設計一種三進制編碼。
構造三叉哈夫曼樹,沒啥好說的,唯一要注意的點是要加一個權重為0的空節點。因為:(n-1)%(m-1)=(14-1)(3-1)=1。我一開始忘加了,寫完才發現不對,浪費了15分鍾。
算法題3個:
1,現有一字符數組S,其中存儲的是從a到z的小寫字母。設計一個算法,對該字符數組進行重新排列,使得所有的字母‘a’都放在前面,其他字母放在a后面,請分析你設計的算法的時間復雜度。
void MaxAFront(char S[],int n);
提供兩種思路:
1,用‘a’做軸,做一趟快排,把小於等於的放左,大於的放右
2,兩個指針pq,p指向0,q遍歷,遇到一個a就交換pq指向的元素然后p++
2,一個有表頭節點的單鏈表l。在不改變鏈表的前提下,請設計一個盡可能高效的算法,查找鏈表中倒數第k(k為正整數)個節點。若查找成功,輸出該節點的data值,並return 1,否則return 0.
int KtoLast(LinkList L,int k)
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList
提供三種思路:
1,兩個指針pq,先讓p走k步,然后pq一起走,如果p指向空,那么q就是倒數第k個元素。
2,計算表長n,然后輸出正向第n-k+1個元素
3,遞歸,返回值是當前層深度,回溯的時候就可以判斷是否為倒數第k個。
這題要注意兩個坑,
一個是列表長度可能小於k,那就是無解。
一個是不允許改變鏈表,也就是說不能用“反轉、取正向第K個、再轉回來”的算法。
3,二叉樹t中,每個節點都擁有一個權值(正整數),請設計一個遞歸算法,求T中所有葉子權值的最大值,假設函數定義如下。
int MaxLeafValue(BiTree T)
typedef struct BiTNode{
int w;
struct BiTNode *lchild,*rchild;
}BiTNode.*BiTree
int MaxLeafValue(BiTree T){
if(!T) return 0;
if(!T->lchild&&!T->rchild) return T->w;
return max(MaxLeafValue(T->lchild), MaxLeafValue(T->rchild));
}