中國大學MOOC-陳越、何欽銘-數據結構-2019夏期末考試

 

1-1對一棵平衡二叉樹,所有非葉結點的平衡因子都是0,當且僅當該樹是完全二叉樹。(2分)   F

1-2n!是O(n​^n​​)的。 (2分)  T

1-3若用平方探測法解決衝突,則插入新元素時,若散列表容量爲質數,插入就一定可以成功。  F

1-4在任一有向圖中,所有頂點的入度之和等於所有頂點的出度之和。 (2分)  T

1-5對N個不同的數據採用冒泡排序進行從大到小的排序,當元素基本有序時交換元素次數肯定最多。 (2分)  F

 

2-1 A

設一個棧的輸入序列是1、2、3、4、5,則下列序列中,是棧的合法輸出序列的是? (4分)

  1. 3 2 1 5 4
  2. 5 1 2 3 4
  3. 4 5 1 3 2
  4. 4 3 1 2 5

2-2 B

已知一棵二叉樹的樹形如下圖所示,其後序序列爲{ eacbdgf }。樹中與結點a同層的結點是:(2分)

  1. c
  2. d
  3. f
  4. g

 2-3 D

給定有權無向圖的鄰接矩陣如下,其最小生成樹的總權重是: (4分)

  1. 10
  2. 11
  3. 12
  4. 14

2-4  B

已知一個圖的鄰接矩陣如下,則從頂點V1出發按深度優先搜索法進行遍歷,可能得到的一種頂點序列爲: (2分)

  1. V1,V2,V3,V4,V5,V6
  2. V1,V2,V4,V5,V6,V3
  3. V1,V3,V5,V2,V4,V6
  4. V1,V3,V5,V6,V4,V2

 2-5  D

設散列表的地址區間爲[0,16],散列函數爲H(Key)=Key%17。採用線性探測法處理衝突,並將關鍵字序列{ 26,25,72,38,8,18,59 }依次存儲到散列表中。元素59存放在散列表中的地址是: (4分)

  1. 8
  2. 9
  3. 10
  4. 11

2-6  C

在拓撲排序算法中用堆棧和用隊列產生的結果會不同嗎?(2分)

  1. 是的肯定不同
  2. 肯定是相同的
  3. 有可能會不同
  4. 以上全不對

 2-7  C

哈夫曼樹是n個帶權葉子結點構成的所有二叉樹中()最小的二叉樹。 (2分)

  1. 權值
  2. 高度
  3. 帶權路徑長度

2-8  C

對給定序列{ 110,119,7,911,114,120,122 }採用次位優先(LSD)的基數排序,則兩趟收集後的結果爲: (2分)

  1. 7, 110, 119, 114, 911, 120, 122
  2. 7, 110, 119, 114, 911, 122, 120
  3. 7, 110, 911, 114, 119, 120, 122
  4. 110, 120, 911, 122, 114, 7, 119

 2-9  B

在並查集問題中,已知集合元素0~8所以對應的父結點編號值分別是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示樹根且對應集合大小爲n),那麼將元素6和8所在的集合合併(要求必須將小集合併到大集合)後,該集合對應的樹根和父結點編號值分別是多少? (4分)

  1. 1和-6
  2. 4和-5
  3. 8和-5
  4. 8和-6

2-10  B

在一個有權無向圖中,如果頂點b到頂點a的最短路徑長度是10,頂點c與頂點b之間存在一條長度爲3的邊。那麼下列說法中有幾句是正確的? (4分)

  1. c與a的最短路徑長度就是13
  2. c與a的最短路徑長度就是7
  3. c與a的最短路徑長度不超過13
  4. c與a的最短路徑不小於7

 2-11  A

已知一個圖的鄰接矩陣如下,則從頂點V1出發按廣度優先搜索法進行遍歷,可能得到的一種頂點序列爲: (2分)

  1. V1,V2,V3,V5,V4,V6
  2. V1,V2,V4,V5,V6,V3
  3. V1,V3,V5,V2,V4,V6
  4. V1,V3,V5,V6,V4,V2

2-12  D

如果循環隊列用大小爲m的數組表示,隊頭位置爲front、隊列元素個數爲size,那麼隊尾元素位置rear爲: (2分)

  1. front+size
  2. front+size-1
  3. (front+size)%m
  4. (front+size-1)%m

 2-13  B

對於序列{ 49,38,65,97,76,13,27,50 },按由小到大進行排序,下面哪一個是初始步長爲4的希爾排序法第一趟的結果? (4分)

  1. 13,27,38,49,50,65,76,97
  2. 49,13,27,50,76,38,65,97
  3. 49,76,65,13,27,50,97,38
  4. 97,76,65,50,49,38,27,13

2-14  C

將 {28, 15, 42, 18, 22, 5, 40} 逐個按順序插入到初始爲空的最小堆(小根堆)中。則該樹的前序遍歷結果爲:(4分)

  1. 5, 18, 15, 28, 22, 42, 40
  2. 5, 15, 18, 22, 28, 42, 40
  3. 5, 18, 28, 22, 15, 42, 40
  4. 5, 15, 28, 18, 22, 42, 40

 2-15  D

設棧S和隊列Q的初始狀態均爲空,元素{1, 2, 3, 4, 5, 6, 7}依次進入棧S。若每個元素出棧後立即進入隊列Q,且7個元素出隊的順序是{2, 5, 6, 4, 7, 3, 1},則棧S的容量至少是: (2分)

  1. 1
  2. 2
  3. 3
  4. 4

2-16  C

要判斷一個整數N(>10)是否素數,我們需要檢查3到√​N​​​之間是否存在奇數可以整除N。則這個算法的時間複雜度是:(2分)

  1. O(N/2)
  2. O(√​N​​​logN)
  3. O(√​N​​​)
  4. O(0.5logN)

 2-17  C

若數據元素序列{ 11,12,13,7,8,9,23,4,5 }是採用下列排序方法之一得到的第二趟排序後的結果,則該排序算法只能是: (2分)

  1. 冒泡排序
  2. 選擇排序
  3. 插入排序
  4. 歸併排序

2-18  B

數據結構中Dijkstra算法用來解決哪個問題? (2分)

  1. 關鍵路徑
  2. 最短路徑
  3. 拓撲排序
  4. 字符串匹配

 2-19  A

給定輸入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函數 h(X)=X%10。如果用大小爲10的散列表,並且用分離鏈接法解決衝突,則輸入各項經散列後在表中的下標爲:(-1表示相應的插入無法成功)(4分)

  1. 1, 3, 3, 9, 4, 9, 9
  2. 1, 3, 4, 9, 7, 5, -1
  3. 1, 3, 4, 9, 5, 0, 8
  4. 1, 3, 4, 9, 5, 0, 2

2-20  D

將1~6這6個鍵值插到一棵初始爲空的二叉搜索樹中。如果插入完成後,搜索樹結構如圖所示,問:可能的插入序列是什麼? (2分)

  1. 1 2 3 4 5 6
  2. 4 1 2 3 5 6
  3. 4 1 3 2 6 5
  4. 4 1 3 2 5 6

 2-21  A

將 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐個按順序插入到初始爲空的最小堆中,然後連續執行兩次刪除最小元素操作(DeleteMin),再插入4,16,此後堆頂的元素是什麼? (4分)

  1. 4
  2. 5
  3. 7
  4. 9

2-22  A

將 9, 8, 7, 2, 3, 5, 6, 4 順序插入一棵初始爲空的AVL樹。下列句子中哪句是錯的? (4分)

  1. 5 是根結點
  2. 2 和 5 是兄弟
  3. 有2個結點的平衡因子爲-1
  4. 最後得到的AVL樹的高度是3

 

 5-1 不會。。這道題0分

下列代碼的功能是利用散列函數hash將一個元素插入到散列表ht[]中。其中list類型的結點包含element類型的項item、以及一個next指針。如果插入成功,則函數返回1,否則返回0。

int insert( struct element item, list_pointer ht[] )
{
   int ret, hash_value;
   list_pointer ptr, trail, lead;

   ret = 1;
   hash_value = hash(item.key);
   trail = NULL; lead = ht[hash_value];
   for ( ; lead; trail = lead, lead = lead->next) {
      if (!strcmp(lead->item.key, item.key)) {
         printf("The key is in the table\n");
         ret = 0;
      }
   }
   if (ret) {
      ptr = (list_pointer)malloc(sizeof(struct list));
      (3分);
      ptr->next = NULL;
      if (trail)
         (3分);
      else
         (3分);
   }
   return ret;
}

5-2

本函數的功能是從有N個元素的線性表A中查找第K大的元素。其中函數BuildMinHeap(H, K)是將元素H[1] ... H[K]調整爲一個最小堆。請完成下列填空。

ElementType FindKthLargest ( int A[], int N, int K )
{   /* it is assumed that K<=N */
    ElementType *H;
    int i, next, child;

    H = (ElementType *)malloc((K+1)*sizeof(ElementType));
    for ( i=1; i<=K; i++ ) H[i] = A[i-1];
    BuildMinHeap(H, K);

    for ( next=K; next<N; next++ ) {
        H[0] = A[next];
        if ( H[0] > H[1] ) {
            for ( i=1; i*2<=K; i=child ) {
                child = i*2;
                if ( child!=K && H[child+1]<H[child] (4分) ) child++;
                if ( H[child]<H[0] (5分) )
                    H[i] = H[child];
                else break;
            }
            H[i] = H[0];
        }
    }
    return H[1];
}

 

7-1 還原二叉樹 (8 分)

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。

輸入格式:

輸入首先給出正整數N(≤50),爲樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度爲N的不包含重複英文字母(區別大小寫)的字符串。

輸出格式:

輸出爲一個整數,即該二叉樹的高度。

輸入樣例:

9
ABDFGHIEC
FDHGIBEAC

輸出樣例:

5
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
int pre[505],in[505],l[505],r[505];
int maxx;
int dfs(int l1,int r1,int l2,int r2)
{
	if(l1>r1)return -1;
	int root=pre[l1];
	int p=l2;
	while(root!=in[p])p++;
	int cnt=p-l2;
	l[root]=dfs(l1+1,l1+cnt,l2,p-1);
	r[root]=dfs(l1+cnt+1,r1,p+1,r2);
	return root;
}
void sc(int x,int s)
{
	if(l[x]==-1&&r[x]==-1)
	{
		if(s>maxx)
		maxx=s;
		return;
	}
	if(l[x]!=-1)sc(l[x],s+1);
	if(r[x]!=-1)sc(r[x],s+1);
}
int main()
{
	int n,i,j;
	char p[55],inn[55];
	memset(l,-1,sizeof l);
	memset(r,-1,sizeof r);
	scanf("%d",&n);
	scanf("%s",p);
	scanf("%s",inn);
	for(i=0;i<n;i++)
	{
		pre[i]=p[i]-'A';
		in[i]=inn[i]-'A';
	}
	maxx=-1;
	dfs(0,n-1,0,n-1);
	sc(pre[0],1);
	printf("%d\n",maxx);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章