2021年408真题数据结构选择题部分

该上传的真题仅作学习交流,请勿商用,谢谢!

关于答案部分,均为本人手写过程拍照上传,此答案偏向个人理解,如有错误,请留言指正。

写字/上传不易,如果可以,希望各位点个赞,后续我可能会上传历年408真题,包括408的4门全部学科真题,以选择题解答为主,大题为辅(不是不想写大题,而是本人实在太菜,基本功不到位,大题理解能力以及代码部分不能达到408优秀的水平)。

1.已知头指针指向一个带头结点的非空单循环链表,结点结构 data next,其中 next 是指向直接后继结点的指针,p 是尾指针,g 为临时指针。现要删除该链表的第一个元素,正确的语句序列是()

A.h->next=h->next >next; g=h->next; free (g);

B.g=h->next; h->next=h->next >next; free (g);

C.g=h->next: h->next=g >next; if (p! =g) p=h; free (g);

D.g=h->next: h->next=g >next; if (p==g) p=h; free (g);

2.已知初始为空的队列 Q 的一端仅能进行入队操作,另外一端既能进行入队操作又能进行出队操作,若 a 的入队序列是 1,2,3,4,5,则不能得到的出队序列是 ()

A.5,4,3,1,2 B.5,3,1,2,4 C.4,2,1,3,5 D.4,1,3,2,5

3.已知二维数组 A 按行优先方法存储,每个元素占用 1 个存储单元,若元素 A[0][0]的存储地址是 100,A[3][3]的存储地址是 220,则元素 A[5][5]的存储地址是()

A.295 B.300 C.301 D.306

4.某森林F对应的二叉树为T,若T的先序遍历序列是a,b,d,c,e,g,f,中序遍历序列是 b,d,a,e,g,c,f,则F 中树的棵数是()

A.1 B.2 C.3 D.4

5.若某二叉树有 5 个叶子结点,其权值分别为 10,12,16,21,30.则其最小的带权路径长度(WPL)是()

A.89 B.200 C.208 D.289

6.给定平衡二叉树如下图所示,插入关键字 23 后,根中的关键字是 ()

A.16 B.20 C.23 D.25

2021年408真题数据结构选择题部分_第1张图片(6图)

2021年408真题数据结构选择题部分_第2张图片(7图)

2021年408真题数据结构选择题部分_第3张图片 (8图)

7.给定如下有向图,该图的拓朴有序序列的个数是()

A.1 B.2 C.3 D.4

8.使用 Dijkstra 算法求下图中从顶点1到其余各顶点的最短路径,将当前找到的从顶点 1到顶点 2,3,4,5 的最短路径长度保存在数组 dist 中,求出第二条最短路径后,dist 中的内容更新为()

A.26,3,14,6 B.25,3,14,6 C.21,3,14,6 D.15,3,14,6

9.在一棵高度为 3 的 B 树中,根为第 1 层,若第 2 层有 4 个关键字,则该树的结点个数最多是()

A.11 B.10 C.9 D.8

10.设数组  (93,946,372,9,146,151,301,485,236,327,43,892) 采用最低位优先 (LSD) 基数排序将S 排列成升序序列,第 1趟分配、收集后,元素 372 之前,之后紧邻的元素是()

A.43,892 B.236,301 C.301,892 D.485,301

11.将关键字 6,9,1,5,8,4,7 依次插入到初始为空的大根堆 H 中,得到的 H 是()

A.9,8,7,6,5,4,1 B.9,8,7,5,6,1,4 C.9,8,7,5,6,4,1 D.9,6,7,5,8,4,1

以上请自己做,做完后可进行答案核对!!

TIPS:答案为标准答案,但是解析过程为自己理解并上传的纸质版,如有异议或者错误,请多加指正,谢谢!

答案:1~5 DDBCB         6~11 DACACB

答案解析:

1,D

解析:本题考查带头结点的非空单循环链表的删除操作。

已知结点结构为 data —>next,其中 next 是指向直接后继结点的指针,p 是尾指针,g 为临时指针。

链表中分为仅有一个元素和多个元素两种情况,见下图:

2021年408真题数据结构选择题部分_第4张图片

(题目为循环链表,NULL指针写错了,应该是指回头结点,变成循环链表,但是不影响该题的思想和做法)

2,D

解析:本题考查队列的应用:双端队列的入队出队序列判断。

本题的双端队列情况是,只允许一端进行入队,另一端既可入队又可出队,如图:

2021年408真题数据结构选择题部分_第5张图片

 需要掌握的知识点:队列的出队顺序为先进先出

分析过程如图:

2021年408真题数据结构选择题部分_第6张图片

在此需要关注的是,在右边进行入队后出队,实际上相当于栈:在一端进行插入和删除,遵循后进先出原则,所以以A为例,右边的2,4入队后,如果优先出队,出队序列反而是4,2,请知。

3,B

解析:本题考查数组压缩存储。

首先关注两个概念,按行优先存储和按列优先存储,对比如图:

2021年408真题数据结构选择题部分_第7张图片

2021年408真题数据结构选择题部分_第8张图片

4,C

解析:该题考查二叉树与森林的转换,二叉树/森林的遍历序列转换,以及根据遍历序列构造唯一的二叉树过程。

I.关于二叉树与森林的转换,遵循孩子兄弟表示法,即左孩子,右兄弟;

II.★★★关于二叉树的遍历转换,牢记如下图:

                 树                                森林                        二叉树

                先根遍历                   先序遍历                   先序遍历

                后根遍历                   中序遍历                   中序遍历

III.关于遍历序列构造唯一二叉树,切记:

                只有前序,后序,层序三种遍历,和中序组合,才能够唯一确定一颗唯一二叉树,

        即:前序+中序,后序+中序,层序+中序可确定唯一的一颗二叉树;其他任意的两种组合的给定序列都无法完全确定一颗唯一二叉树。

基于上述知识点,解答过程截图如下:

2021年408真题数据结构选择题部分_第9张图片

5,B

解析:本题考查二叉树带权路径长度WPL以及哈夫曼树。

相关知识点:

结点的带权路径长度WPL:从树的根到该结点的路径长度(即经过的边数),与该结点上权值的乘积。

树的带权路径长度WPL:树中所有叶子结点的带权路径长度之和。

哈夫曼树(最优二叉树):在含有N个带权叶结点的二叉树中,其中带权路径WPL最小的二叉树称为哈夫曼树。

哈夫曼树的构造:

        1,将N个结点分别作为一颗只有根结点的二叉树,构成一个森林F;

        2,构造一个新结点,新结点是森林F中选取俩棵根结点权值最小的二叉树作为新结点的左右子树,结点的权值为左右子树根结点权值之和;然后递归步骤2(重复做步骤2);

        3,直到森林F中仅剩一颗树为止;此时所有的N个结点均为叶子结点,此时叶子结点的全部带权路径之和WPL,必然为最小,此棵树即为哈夫曼树。

TIPS:哈夫曼树是不唯一的,可能有多种构造形态,但是哈夫曼树的WPL一定是唯一且最小的

以下为个人解答过程的纸质版:

2021年408真题数据结构选择题部分_第10张图片

6,D

解析:本题考查平衡二叉树的插入,涉及到平衡二叉树的插入后调整,分为4种情况:RR,RL,LR,LL的四种情况;此外需额外关注平衡二叉树的删除,同样也分4种情况,但稍有不同,注意加以区分。

2021年408真题数据结构选择题部分_第11张图片2021年408真题数据结构选择题部分_第12张图片

该题需要插入关键字23,当前图是一颗二叉排序树,基于二叉排序树,需要将23插入到25的左子树部分;此时,观察该树,发现根结点所在的位置,左右子树的高度差为2,而其子树的高度差要么为0,要么为1,即当前二叉排序树在根结点处发生了不平衡,不平衡的原因是:根结点的右子树的左孩子发生了变化,即插入一个关键字的类型是RL

插入关键字导致不平衡的RL类型,恢复过程为:先将根结点的右孩子的左子树右旋,再将根结点的右孩子左旋,手写过程截图如下:

2021年408真题数据结构选择题部分_第13张图片

 因此调整后根结点的关键字为25。

7,A

解析:本题考查图的应用中拓扑序列的定义,以及如何手动构造拓扑序列。

相关知识点:

AOV网:ACTIVITY ON VERTEX NETWORK,定点表示网络,用DAG(有向无环图)表示一个工程;

AOE网:ACTIVITY ON EDGE NETWORK,边表示网络;

拓扑排序:有一个有向无环图的顶点组成的序列。

拓扑排序的过程:

        1,从AOV网种选择一个没有前驱(即入度为0)的顶点并输出;

        2,从网中删除该顶点和所有以它为起点的有向边;

        3,重复1和2,直到AOV网为空。

TIPS:拓扑排序序列可能不唯一。

TIPS:若图中有环,则不存在拓扑排序序列。

2021年408真题数据结构选择题部分_第14张图片左图为该需要拓扑排序的图;

手工算法截图如下:

2021年408真题数据结构选择题部分_第15张图片

8,C

解析:本题考查迪杰斯特拉算法的判定过程。

相关知识点:迪杰斯特拉算法属于最短路径问题。

最短路径问题分为两种: 单源最短路径:DFS,迪杰斯特拉算法;

                                         各顶点间的最短路径:弗洛伊德(floyd)算法;

本题涉及的是单源最短路径中的迪杰斯特拉算法,求的是一个顶点到各个顶点的最短路径的过程。

以下为纯理论知识,如果不太想看可以跳过,直接跳到手写答案的截图步骤;

迪杰斯特拉算法求1个顶点到其他各个顶点的最短路径过程:

        1,建立三个数组:final[],dist[],path[]并初始化三个数组;

final[]数组(手动计算)可用(✔)来标记各个顶点是否已找到最短路径,刚开始时需要对final[]进行初始化,即:对当前的顶点做标记,用✔表示。

dist[]数组可用来表示从当前顶点(包括当前顶点,值记为0)到各个顶点的已知的最短路径长度数值,如果按当前情况无法到达某个顶点,路径长度数值为无穷大。

path[]数组可表示到达当前顶点的前驱结点的编号;比如:需要到达当前顶点B,需要经过前驱结点A,即需要到达B,上一步走A,从A跳转到B。

        2,当所有数组初始化后,默认当前顶点是初始顶点,计算初始顶点走到各个顶点的距离;

第一轮:初始化后,初始顶点的final值为✔,此时dist数组中,初始顶点的path值被排除在外,找出其他path数组中值最小的,并将其值对应的顶点final数值✔,表示从初始位置到当前顶点的最短距离已经找到,后续不用关注当前顶点的final和dist值;然后以当前顶点为中心,计算初始顶点到其他所有顶点中,走当前顶点走,能到达的其他顶点数值(排除当前顶点和初始顶点),相对初始化的dist数组,如果数值跟其一样大,则不需要修改;如果比其小,则修改为更小的值,并且将修改的能够达到的顶点;

第二轮:根据上一轮得到的两个数组dist和final,已经有初始顶点和一个由上一步确定的顶点数值是固定的,从剩下的顶点位置中选择一个dist值最小的,并且将相关fianl标记为✔,继续进行步骤2;直到所有的dist都已经确定,此时的dist数组为从初始顶点到各个顶点的最短路径;path数组表示从初始顶点到当前顶点的上一步走的是哪个顶点。

2021年408真题数据结构选择题部分_第16张图片左为求最短路径的图;

本题从顶点1出发,求顶点1到其他各个顶点的最短路径,手写步骤截图如下:

2021年408真题数据结构选择题部分_第17张图片

9,A

解析: 本题考查B树的关键字,分支结点以及树高之间的关系。

当前题型为:判断给定树高,求最多的结点数。

相关知识点:

2021年408真题数据结构选择题部分_第18张图片

含N个关键字的M阶B树,最小高度,最大高度为多少?

    最小高度————让每个结点尽可能填满树,以M阶B树为例,有M-1个关键字,也就是M个分叉(M棵子树),则有:

        第一层是M-1个关键字,第二层有M*(M-1)个关键字,第三层有M*(M-1)*M个关键字,所以第h层有M*(M-1)*M*M......共h-1个M相乘,那么有:(M-1)(1+M+M^2+M^3+...+M^h-1)= m^h -1 。

        此时n<=m^h-1 ,化简可得:

    最大高度————让各层的分叉尽可能的少,即根结点只有两个分叉,其他结点只有(向上取整)个分叉。

    我们可以从h层高的树的叶子结点入手,计算叶子结点的个数(N+1)与最少情况下每层结点的个数进行对比即可,具体方法如下:

        ☆各层的结点至少有:第一层1个,第二层2个,第三层2个,第h层2*()^(h-2),那么h+1层共有叶子结点2*()^(h-1)个。

        N个关键字的B树必然有N+1个叶子结点(可以理解为二叉排序树查找失败的那些失败结点,失败结点实际上指向NULL为空,但是个数为结点个数+1),王道书上解释:N个关键字将数域切分为N+1个区间;

    ★★★综上,N个关键字的M阶B树,最小和最大高度为:

本题手写过程截图如下:

2021年408真题数据结构选择题部分_第19张图片

10,C

解析:该题考查了内部排序中很少考查的冷门知识点-----基数排序。

相关知识点:

基数排序:将一组序列按照个十百(或者相反)得顺序用链式指针串联起来,经过r(基数r,表示个十百的位数)次排序,得到有序序列。

举例说明:

2021年408真题数据结构选择题部分_第20张图片

后续继续以”十“和”百“为一趟进行排序,最终得到有序序列。

总结:基数排序是稳定的;它擅长处理元素个数n较大且每组关键字基数r较小的数据队列。

 本题手写过程截图如下:

2021年408真题数据结构选择题部分_第21张图片

11,B

解析:本题主要考查大根堆插入操作。

相关知识点:需要掌握建堆,大/小根堆的插入,删除操作,以及由给定大/小根堆进行堆排序的过程。(代码过于复杂,不要求掌握,但是上述题型为历年考研选择题常客,需熟练掌握)

 大/小根堆的插入/删除操作

堆的插入与删除

    堆的插入

        1,将新插入结点放入数组末端,也就是堆的末端;

        2,新元素与父节点进行比较,若小于父节点,则结束;若大于父节点,则将新元素与父节点互换,继续重复2。

key:大根堆的插入,新元素一定插入堆底,插入后新元素一定不断上升;

    堆的删除

        1,删除元素后,用堆底元素代替被删除结点;

        2,堆底元素不断进行下坠,直到符合大根堆/小根堆的要求。

总结:堆排序空间复杂度为常数级,O(1);时间复杂度为O(nlog2 n);堆排序不稳定,且只适用于顺序表;堆排序的插入与删除中,对于关键字的比较需要重点关注,考研经常容易考关于大小根堆插入删除的关键字比较:

        当堆进行插入时,仅与父节点对比一次即可,如果小于父节点则结束插入步骤;如果大于当前父节点则与父节点互换,继续与父节点进行对比,直到结束或者该节点变为根结点。一般情况下堆插入时,关键字比较只比较一次

        当堆进行删除时,需要用最下方的结点代替被删除结点,然后将该结点逐渐下坠,达成大小根堆的要求。但是当下坠时,如果孩子结点为左右双结点,则需要先对比左右孩子,选择其中较大/小的一个,再与当前结点进行比较,关键字比较两次;如果孩子结点仅有一个,那么只需要将该结点与孩子结点进行比较,关键字比较一次;重复上述步骤,直到结束或者最终变为新的大/小根堆。一般情况下堆删除时,关键字比较可能比较一次,也可能比较两次

本题手写过程截图如下:

2021年408真题数据结构选择题部分_第22张图片

你可能感兴趣的:(数据结构408真题选择题部分,数据结构,考研)