中国大学MOOC-陈越、何钦铭-数据结构-2017春期中考试

一、判断题
1、若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。
(T)
解析:依据出栈序列,可推出的进出栈为PPPOPO,至此得到序列为{3,4},然后栈顶元素是2,不可能跳过2而抛出1。(P为Push,O为POP)

2、将N个数据按照从小到大顺序组织存放在一个单向链表中。如果采用二分查找,那么查找的平均时间复杂度是O(logN)
(F)
解析:在数组中,这是对的。但是在单向列表中,由于不能通过下标直接访问元素,因此无法进行二分查找

3、用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。
(F)
解析:在有向图中,多一条边就多占一个结点的空间;在无向图中,多一条边多占两个结点的空间。图中多一个结点就多占一个结点的空间

4、在一棵二叉搜索树上查找63,序列39、101、25、80、70、59、63是一种可能的查找时的结点值比较序列。
(F)
解析:根结点39,63大,往右子树找,但是右子树中有25比39小,二叉搜索树右子树的结点一定比根结点大,所以错

5、一棵有124个结点的完全二叉树,其叶结点个数是确定的。
(T)
解析:完全二叉树:只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。按这个规则,叶结点个数是确定的

6、将1、2、3、4、5、6顺序插入初始为空的AVL树中,当完成这6个元素的插入后,AVL树的先序遍历结果:4、2、1、3、5、6
(T)
解析:按照AVL树的插入规则,边插元素边旋转树,最后得到的树的先序遍历结果是4、2、1、3、5、6

7、所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。
(F)
解析:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue);
这题不太理解

8、算法分析的两个主要方面是时间复杂度和空间复杂度的分析。
(T)

9、某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无右孩子。

(T)

解析:后序遍历序列是 {左右根},中序遍历序列是{左根右};根结点一定存在,因此看有无左右结点。同时没有右结点,他们的遍历序列都是{左根}

10、如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G中一定有回路。

(F)

解析:说明G一定有两个连通分量


二、选择题

1、在一个用数组表示的完全二叉树中,如果根结点下标为1,那么下标为17和19这两个结点的最近公共祖先结点在哪里(数组下标)? (注:两个结点的“公共祖先结点”是指同时都是这两个结点祖先的结点) 

答案:4

解析:17的父结点下标是17/2 = 8, 19的父结点下标是9,因为他们父结点不同,继续求父结点的父结点得到4


2、若借助堆栈将中缀表达式a+b*c+(d*e+f)*g转换为后缀表达式,当读入f时,堆栈里的内容是什么(按堆栈自底向上顺序)? 

答案:+(+

解析:第一个 + 先进栈,然后 * 优先级比 + 高, * 进栈;第二个 + 优先级小于 * ,因此 * 出栈;由于两个 + 优先级相同,所以第一个 + 出栈,第二个 + 进栈; ( 优先级高于 + , ( 进栈; * 优先级高于 入栈后的 (, * 进栈; 第三个 + 优先级小于 *  , 因此 * 出栈, + 入栈;这时读到f,堆栈中元素是+(+


3、三叉树中,度为1的结点有5个,度为2的结点3个,度为3的结点2个,问该树含有几个叶结点? 

答案:8

解析:树的结点树数 = 所有结点的度数 + 1(根结点);三叉树中只有度为0,1,2,3的结点,所以总结点数为5 * 1 + 3 * 2 + 2 * 3 + 1 = 18;叶结点数 = 18 - 5 - 3 - 2 = 8


4、将6、4、3、5、8、9顺序插入初始为空的最大堆(大根堆)中,那么插入完成后堆顶的元素为: 

答案:9

解析:最大堆,堆顶元素一定是所有元素中最大的


5、给定N×N×N的三维数组A,则在不改变数组的前提下,查找最小元素的时间复杂度是

答案:N^3

解析:三重循环一个个比较过去


6、若用大小为6的数组来实现循环队列,且当前frontrear的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,frontrear的值分别为多少?

答案:2和0

解析:删除2个元素,front  = (front + 2) % 6;加入两个元素 ,rear = (rear + 2) % 6;


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

答案:4和-5

解析:依据题意,可以知道森林中有3颗树,分别以1, 4, 8为根结点; 6 的父结点是 4,因此就是根结点为4和8的两颗树合并;根结点为4的树中有3个元素,根结点为8的树中有2个元素,小集合并到大集合,所以4作为树根, 树中元素变为5个,也就是-5


8、给定程序时间复杂度的递推公式:T(1)=1T(N)=2T(N/2)+N。则程序时间复杂度是:

答案:O(NlogN)

解析:

方法一:

T(2N) = 2T(N) + 2N

T(2N)/(2N) = T(N)/N + 1

令C(N) = T(N)/N

C(2N) - C(N) = 1

令2N = 2^k

C(2^k) - C(2^(k-1)) = 1

C(2^(k-1))  - C(2^(k-2))  = 1

...

C(2) - C(1) = 1

累加上式得

C(2^k) = k + C(1)

令n = 2^k

k = log2(n)

T(n)/n = log2(n) + C(1)

T(n) =  nlog2(n) + nC(1)

所以时间复杂度为O(NlogN)


方法二:

T(8)->T(4)+T(4)+8->T(2)+T(2)+T(2)+T(2) +8+8->T(1)*8+8+8+8 = 8*4 

递归深度为logn每层执行n次


方法三:



9、已知一棵二叉树的先序遍历结果是ABC,则以下哪个序列是不可能的中序遍历结果:

答案:CAB

解析:A是根结点,中序遍历如果是CAB,那么C为左子结点,B为右子结点;先序遍历为ACB,与题目矛盾


10、下列函数中,哪个函数具有最快的增长速度? 

A.N^2logN   B.N^3   C.NlogN^2   D.N(logN)^4

答案:B


11、设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数?

答案:2

解析:等长方式编码所占位数:2 * (4 + 2 + 5 + 1) = 24;哈夫曼编码所占位数:1 * 3 + 2 * 3 + 4 * 2 + 5 * 1 = 22;


12、h为不带头结点的单向链表。在h的头上插入一个新结点t的语句是:

答案:t->next = h; h = t

解析:插入结点,一般都是先将新结点的next接好,然后再新结点连到上一个结点。如果倒过来,链表就会在插入的地方断开,找不到后面的结点了。因为不带头结点,所以直接用h,否则用h->next



三、程序填空题

  1. 下列代码的功能是从一个大顶堆H的某个指定位置p开始执行下滤。

    void PercolateDown( int p, PriorityQueue H )
    {
       int  child;
       ElementType  Tmp = H->Elements[p];
       for ( ; p * 2 <= H->Size; p = child ) {
          child = p * 2;
          if ( child!=H->Size && (6分) )
             child++;
          if ( H->Elements[child] > Tmp )
             (6分);
          else  break;
       }
       H->Elements[p] = Tmp; 
    }

解析:大顶堆下滤,先找左右孩子中大的那个;然后p位置的元素和大的孩子比较,p小,大的孩子就覆盖p,否则就确定p为当前的位置。



  1. 2

    下列代码的功能是返回带头结点的单链表L的逆转链表。

    List Reverse( List L )
    {
        Position Old_head, New_head, Temp;
        New_head = NULL;
        Old_head = L->Next;
    
        while ( Old_head )  {
            Temp = Old_head->Next;
            (6分);  
            New_head = Old_head;  
            Old_head = Temp; 
        }
        (6分);
        return L;
    }

解析:逆转链表,New_head记录已逆转链表的头结点,Old_head记录未逆转的链表的头结点,Temp记录Old_head下一个结点(防止逆转后找不到之前的结点),最后将L->Next(头节点)与已逆转链表的头结点连接,得到一个完全逆转的链表。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值