编程题每个人都不一样,就不放了。

判断题

1-1 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。 (2分)

T

F

1-2 在一个有向图中,所有顶点的入度与出度之和等于所有边之和的2倍。 (2分)

T

F

1-3 若用平方探测法解决冲突,则插入新元素时,若散列表容量为质数,插入就一定可以成功。 (2分)

T

F

1-4NlogN2和NlogN具有相同的增长速度。 (2分)

T

F

这道题我错了,没看清,应该是T

1-5 若一棵平衡二叉树的所有非叶结点的平衡因子都是0,则其必为完美二叉树。(2分)

T

F

单选题

2-1 给定有权无向图的邻接矩阵如下,其最小生成树的总权重是: (4分)

浙大数据结构与算法在线作业 浙大数据结构期末考试_MOOC

A.10

B.11

C.14

D.12

2-2 给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10。如果用大小为10的散列表,并且用分离链接法解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)(4分)

A.1, 3, 4, 9, 7, 5, -1

B.1, 3, 4, 9, 5, 0, 8

C.1, 3, 3, 9, 4, 9, 9

D.1, 3, 4, 9, 5, 0, 2

2-3 在图中自d点开始进行深度优先遍历算法可能得到的结果为: (2分)

浙大数据结构与算法在线作业 浙大数据结构期末考试_数据结构_02

A.d,a,e,b,c,f

B.d,e,a,c,f,b

C.d,f,c,e,a,b

D.d,a,c,f,e,b

2-4 在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示树根且对应集合大小为n),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少? (4分)

A.8和-5

B.1和-6

C.8和-6

D.4和-5

2-5 数据结构中Dijkstra算法用来解决哪个问题? (2分)

A.字符串匹配

B.最短路径

C.拓扑排序

D.关键路径

2-6 对一组数据{ 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分)

A.基数排序

B.希尔排序

C.归并排序

D.冒泡排序

2-7 给出关键字序列{ 4321, 56, 57, 46, 28, 7, 331, 33, 234, 63 },下面哪个选择是按次位优先(LSD)链式基数排序进行了一趟分配和收集的结果? (2分)

A.→4321→331→33→63→234→56→46→57→7→28

B.→331→4321→33→63→234→56→46→57→7→28

C.→56→28→4321→331→33→234→46→57→63→7

D.→57→46→28→7→33→234→63→56→4321→331

2-8 在一个有权无向图中,如果顶点b到顶点a的最短路径长度是10,顶点c与顶点b之间存在一条长度为3的边。那么下列说法中有几句是正确的? (4分)

  • c与a的最短路径长度就是13
  • c与a的最短路径长度就是7
  • c与a的最短路径长度不超过13
  • c与a的最短路径不小于7

A.3句

B.1句

C.2句

D.4句

2-9 设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是? (4分)

A.3 2 1 5 4

B.4 5 1 3 2

C.4 3 1 2 5

D.5 1 2 3 4

2-10 对于序列{ 49,38,65,97,76,13,27,50 },按由小到大进行排序,下面哪一个是初始步长为4的希尔排序法第一趟的结果? (4分)

A.13,27,38,49,50,65,76,97

B.49,76,65,13,27,50,97,38

C.97,76,65,50,49,38,27,13

D.49,13,27,50,76,38,65,97

2-11要判断一个整数N(>10)是否素数,我们需要检查3到 N \sqrt{N} N之间是否存在奇数可以整除N。则这个算法的时间复杂度是:(2分)

A.O(√N)

B.O(N/2)

C.O(0.5logN)

D.O(√NlogN)

2-12 给定一有向图的邻接表如下。若从v1开始利用此邻接表做广度优先搜索得到的顶点序列为:{v1, v3, v2, v4, v5},则该邻接表中顺序填空的结果应为: (2分)

浙大数据结构与算法在线作业 浙大数据结构期末考试_MOOC_03

A.v2, v3, v4

B.v3, v4, v2

C.v4, v3, v2

D.v3, v2, v4

2-13 将1~6这6个键值插到一棵初始为空的二叉搜索树中。如果插入完成后,搜索树结构如图所示,问:可能的插入序列是什么? (2分)

浙大数据结构与算法在线作业 浙大数据结构期末考试_2019春_04

A.4 1 3 2 5 6

B.4 1 2 3 5 6

C.1 2 3 4 5 6

D.4 1 3 2 6 5

2-14 设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是: (2分)

A.4

B.1

C.2

D.3

2-15 将 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐个按顺序插入到初始为空的最小堆中,然后连续执行两次删除最小元素操作(DeleteMin),再插入4,16,此后堆顶的元素是什么? (4分)

A.4

B.7

C.5

D.9

2-16 将 9, 8, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的? (4分)

A.2 和 5 是兄弟

B.有2个结点的平衡因子为-1

C.最后得到的AVL树的高度是3

D.5 是根结点

2-17给定散列表大小为17,散列函数为H(Key)=Key%17。采用平方探测法处理冲突:hi(k)=(H(k)±i2)%17将关键字序列{ 23, 22, 7, 26, 9, 6 }依次插入到散列表中。那么元素6存放在散列表中的位置是:(4分)

A.2

B.10

C.6

D.15

2-18 如果循环队列用大小为m的数组表示,队头位置为front、队列元素个数为size,那么队尾元素位置rear为: (2分)

A.front+size

B.(front+size)%m

C.(front+size-1)%m

D.front+size-1

2-19 哈夫曼树是n个带权叶子结点构成的所有二叉树中()最小的二叉树。 (2分)

A.带权路径长度

B.高度

C.权值

D.度

2-20 给定二叉树如下图所示。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为3、1、7、5、6、2、4,则其遍历方式是: (2分)

浙大数据结构与算法在线作业 浙大数据结构期末考试_MOOC_05

A.RNL

B.LRN

C.RLN

D.NRL

2-21 在拓扑排序算法中用堆栈和用队列产生的结果会不同吗?(2分)

A.肯定是相同的

B.是的肯定不同

C.以上全不对

D.有可能会不同

2-22 设最小堆(小根堆)的层序遍历结果为{5, 18, 15, 28, 22, 42, 40}。用线性时间复杂度的算法将该堆调整为最大堆(大根堆),则该树的中序遍历结果为:(4分)

A.18, 28, 22, 15, 40, 5, 42

B.18, 28, 22, 42, 15, 40, 5

C.5, 22, 18, 42, 15, 40, 28

D.22, 5, 18, 42, 40, 15, 28

程序填空题

5-1 本函数的功能是从有N个元素的线性表A中查找第K小的元素。其中函数BuildMaxHeap(H, K)是将元素H[1] … H[K]调整为一个最大堆。请完成下列填空。

1.H[child+1]>H[child]

2.H[child]>H[0]

ElementType FindKthSmallest ( 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];
    BuildMaxHeap(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] ) child++;
                if ( H[child]>H[0] )
                    H[i] = H[child];
                else break;
            }
            H[i] = H[0];
        }
    }
    return H[1];
}

5-2 The function is to do topological sort on a graph G. TopNum[] starts counting from 1.

1.++counter

2.--Indegree[W]

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] = ++counter;
      for ( ptr=G->List[V]; ptr; ptr=ptr->Next) {
         W = ptr->Vertex;
         if ( --Indegree[W] == 0 )
            Enqueue(W, Q);
      }
   }
   if ( counter != NumVertex )
      printf("ERROR: Graph has a cycle.\n");
   DisposeQueue(Q);
}