北理889只考一門數據結構,不像其他院校(408,912)計算機專業要考四大名著(機組,計網,數據結構,操作系統)。
下面列出的選擇填空題目不全,只有一些印象深刻的和比較重要的。(大題沒有考AVL樹,B+樹,關鍵路徑,線索二叉樹,哈夫曼樹,最小增量排序,基數排序有點兒失望)從算法題和簡答題可以看出來,北理還是比較注重基礎的,但是我在今年的卷紙上看到了往年的影子,拿到卷紙第一感覺是材質很一般,然后就是有種woc我是不是被透題了的感覺。。。今年選擇填空沒出文字游戲好評,卷面感覺沒有哪題有二義性。
成績已經出來了,數據結構122
轉載注明出處 :http://www.cnblogs.com/xuwangzihao/p/8099016.html
感謝北理考研群各位伙伴一路陪伴:492030260
選擇(20*2分)
前三道題考什么是邏輯結構什么是存儲結構。(存儲結構:線性非線性。邏輯結構:hash)
時間復雜度O(n^2)代表程序運行時間與n^2成正比
m階B-樹是m階平衡二叉樹
無向圖任意一點可深搜遍歷所有的點意味着這圖是個連通圖。
線性探測解決沖突的hash,k個數字映射到一個位置產生多少次沖突? k(k-1)/2
一個二叉樹,每個節點度為0或2,問你高度為h,最少多少個節點?(2h-1)
當一組數據里面的數都離它該在的位置很近的時候,用直接插入排序進行排序。
鄰接矩陣是對稱矩陣的圖是無向圖
1001個點的完全二叉樹有501個葉子節點。
用數組存儲二叉樹,21個節點高度為6的至少需要把數組開多大?63
循環隊列存在a[0..20],尾指針指向尾元素,頭指針指向頭元素的前一個,現在頭指8尾指3,隊里有16個元素。
123456順序進棧,問不可能的出棧序列。
abcdef順序進入一個兩邊都可進,只能一邊出的隊列,問不可能的出隊序列。
填空(20*2分)
兩個串相等的充要條件?長度相等,對應位內容相同(超綱,不過幸好沒有考KMP)
給你一個廣義表,問你表長和深度。(超綱)
7階B-樹非根節點最少有幾個子樹
20個數字做歸並排序,需要5趟歸並,第3趟時把長度為4的數據合並成長度為8的。
在稠密圖上求最小生成樹用prime算法比較好
無向的完全圖有多少個邊?有向的完全圖有多少個邊? n(n-1)/2, n(n-1)
給你幾個數,問你他們構成的二叉搜索樹長啥樣。
10個點的圖用Dijkstra,時間是10ms,則40個點大概160ms。(考它的時間復雜度的
希爾排序最后一趟的增量必須是1。
有頭節點的鏈表為空的判斷條件是什么?head->next=0
順序表里存了n個數據,查找某個數據並命中最多需要關鍵字比較n次,不命中,需要比較n+1次。
簡答(4*10分)
1,漢諾塔時間復雜度分析。
O(2^n)
2,進棧順序是abcdefg,出棧序列是bdcfeag,問具體的進棧出棧次序。
操作 棧 輸出序列
push(a) push(b) ab NULL
pop(b) a b
push(c) push(d) acd b
pop(d) pop(c) a bdc
push(e) push(f) aef bdc
pop(f) pop(e) pop(a) NULL bdcfea
push(g) g bdcfea
pop(g) NULL bdcfeag
3,n*n的特殊矩陣(主對角線上三角矩陣)A壓縮存儲在一維數組s里,寫出s[k]和a[i][j]的具體關系。(略)
4,鏈式解決沖突的hash表,hash函數x%13,hash表容量13,給你12個數字,讓你畫出hash后的情況,問你命中時的ASL和不命中時的ASL。(略)
不命中的ASL比較特別,要去看書不能想當然。
算法設計(3*10分)
1,刪除有頭節點鏈表最小值,有頭節點,傳入參數是頭節點的指針。

1 typedef struct Link{ 2 ElemType data; 3 Link* next; 4 }*LinkList; 5 bool deleteMin(LinkList head){ 6 if(!head->next)return 0;//fail 7 //找到想要刪除的目標節點的前驅 8 LinkList p=head->next,aim=head; 9 while(p->next){ 10 if(p->next->data<aim->data)aim=p; 11 p=p.next; 12 } 13 //屏蔽掉那個節點並釋放空間(刪除它) 14 p=aim->next; 15 aim->next=aim->next->next; 16 free(p); 17 return 1;//success 18 }
2,中序遍歷,非遞歸實現。(下面不是標准答案,標准答案去看書)

1 #include<vector> 2 #include<cstdio> 3 using namespace std; 4 typedef struct Node{ 5 int data; 6 Node * lc; 7 Node * rc; 8 }BTNode; 9 vector<pair<BTNode*,bool> > s;//second 表示它的左孩子是否訪問過 10 void inOrder(BTNode * root){ 11 pair<BTNode*,bool> tmp; 12 tmp.first=root;tmp.second=0; 13 s.push_back(tmp); 14 while(!s.empty()){ 15 tmp=s.back(); 16 s.pop_back(); 17 if(!tmp.second){ 18 tmp.second=1; 19 if(tmp.first->lc){ 20 s.push_back(tmp); 21 tmp.first=tmp.first->lc; 22 tmp.second=0; 23 s.push_back(tmp); 24 }else{ 25 s.push_back(tmp); 26 } 27 }else{ 28 printf("%d\n",tmp.first->data);//work() 29 if(tmp.first->rc){ 30 tmp.first=tmp.first->rc; 31 tmp.second=0; 32 s.push_back(tmp); 33 } 34 } 35 } 36 } 37 //用到了C++的vector和pair,為了標記當前棧頂元素狀態,vector模擬棧
3,遞歸實現的快排。

1 int Partition(int *a,int l,int r){ 2 a[0]=a[l]; 3 while(l<r){ 4 while(l<r&&a[r]>=a[0])r--; 5 a[l]=a[r]; 6 while(l<r&&a[l]<=a[0])l++; 7 a[r]=a[l]; 8 } 9 a[l]=a[0]; 10 return l; 11 } 12 void QuickSort(int *a,int l,int r){ 13 if(l<r){ 14 int pivot=Partition(a,l,r); 15 QuickSort2(a,l,pivot-1); 16 QuickSort2(a,pivot+1,r); 17 } 18 }