该上传的真题仅作学习交流,请勿商用,谢谢!
关于答案部分,均为本人手写过程拍照上传,此答案偏向个人理解,如有错误,请留言指正。
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
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 为临时指针。
链表中分为仅有一个元素和多个元素两种情况,见下图:
(题目为循环链表,NULL指针写错了,应该是指回头结点,变成循环链表,但是不影响该题的思想和做法)
2,D
解析:本题考查队列的应用:双端队列的入队出队序列判断。
本题的双端队列情况是,只允许一端进行入队,另一端既可入队又可出队,如图:
需要掌握的知识点:队列的出队顺序为先进先出。
分析过程如图:
在此需要关注的是,在右边进行入队后出队,实际上相当于栈:在一端进行插入和删除,遵循后进先出原则,所以以A为例,右边的2,4入队后,如果优先出队,出队序列反而是4,2,请知。
3,B
解析:本题考查数组压缩存储。
首先关注两个概念,按行优先存储和按列优先存储,对比如图:
4,C
解析:该题考查二叉树与森林的转换,二叉树/森林的遍历序列转换,以及根据遍历序列构造唯一的二叉树过程。
I.关于二叉树与森林的转换,遵循孩子兄弟表示法,即左孩子,右兄弟;
II.★★★关于二叉树的遍历转换,牢记如下图:
树 森林 二叉树
先根遍历 先序遍历 先序遍历
后根遍历 中序遍历 中序遍历
III.关于遍历序列构造唯一二叉树,切记:
只有前序,后序,层序三种遍历,和中序组合,才能够唯一确定一颗唯一二叉树,
即:前序+中序,后序+中序,层序+中序可确定唯一的一颗二叉树;其他任意的两种组合的给定序列都无法完全确定一颗唯一二叉树。
基于上述知识点,解答过程截图如下:
5,B
解析:本题考查二叉树带权路径长度WPL以及哈夫曼树。
相关知识点:
结点的带权路径长度WPL:从树的根到该结点的路径长度(即经过的边数),与该结点上权值的乘积。
树的带权路径长度WPL:树中所有叶子结点的带权路径长度之和。
哈夫曼树(最优二叉树):在含有N个带权叶结点的二叉树中,其中带权路径WPL最小的二叉树称为哈夫曼树。
哈夫曼树的构造:
1,将N个结点分别作为一颗只有根结点的二叉树,构成一个森林F;
2,构造一个新结点,新结点是森林F中选取俩棵根结点权值最小的二叉树作为新结点的左右子树,结点的权值为左右子树根结点权值之和;然后递归步骤2(重复做步骤2);
3,直到森林F中仅剩一颗树为止;此时所有的N个结点均为叶子结点,此时叶子结点的全部带权路径之和WPL,必然为最小,此棵树即为哈夫曼树。
TIPS:哈夫曼树是不唯一的,可能有多种构造形态,但是哈夫曼树的WPL一定是唯一且最小的。
以下为个人解答过程的纸质版:
6,D
解析:本题考查平衡二叉树的插入,涉及到平衡二叉树的插入后调整,分为4种情况:RR,RL,LR,LL的四种情况;此外需额外关注平衡二叉树的删除,同样也分4种情况,但稍有不同,注意加以区分。
该题需要插入关键字23,当前图是一颗二叉排序树,基于二叉排序树,需要将23插入到25的左子树部分;此时,观察该树,发现根结点所在的位置,左右子树的高度差为2,而其子树的高度差要么为0,要么为1,即当前二叉排序树在根结点处发生了不平衡,不平衡的原因是:根结点的右子树的左孩子发生了变化,即插入一个关键字的类型是RL。
插入关键字导致不平衡的RL类型,恢复过程为:先将根结点的右孩子的左子树右旋,再将根结点的右孩子左旋,手写过程截图如下:
因此调整后根结点的关键字为25。
7,A
解析:本题考查图的应用中拓扑序列的定义,以及如何手动构造拓扑序列。
相关知识点:
AOV网:ACTIVITY ON VERTEX NETWORK,定点表示网络,用DAG(有向无环图)表示一个工程;
AOE网:ACTIVITY ON EDGE NETWORK,边表示网络;
拓扑排序:有一个有向无环图的顶点组成的序列。
拓扑排序的过程:
1,从AOV网种选择一个没有前驱(即入度为0)的顶点并输出;
2,从网中删除该顶点和所有以它为起点的有向边;
3,重复1和2,直到AOV网为空。
TIPS:拓扑排序序列可能不唯一。
TIPS:若图中有环,则不存在拓扑排序序列。
手工算法截图如下:
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数组表示从初始顶点到当前顶点的上一步走的是哪个顶点。
本题从顶点1出发,求顶点1到其他各个顶点的最短路径,手写步骤截图如下:
9,A
解析: 本题考查B树的关键字,分支结点以及树高之间的关系。
当前题型为:判断给定树高,求最多的结点数。
相关知识点:
含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个区间;。
本题手写过程截图如下:
10,C
解析:该题考查了内部排序中很少考查的冷门知识点-----基数排序。
相关知识点:
基数排序:将一组序列按照个十百(或者相反)得顺序用链式指针串联起来,经过r(基数r,表示个十百的位数)次排序,得到有序序列。
举例说明:
后续继续以”十“和”百“为一趟进行排序,最终得到有序序列。
总结:基数排序是稳定的;它擅长处理元素个数n较大且每组关键字基数r较小的数据队列。
本题手写过程截图如下:
11,B
解析:本题主要考查大根堆插入操作。
相关知识点:需要掌握建堆,大/小根堆的插入,删除操作,以及由给定大/小根堆进行堆排序的过程。(代码过于复杂,不要求掌握,但是上述题型为历年考研选择题常客,需熟练掌握)
大/小根堆的插入/删除操作
堆的插入与删除
堆的插入
1,将新插入结点放入数组末端,也就是堆的末端;
2,新元素与父节点进行比较,若小于父节点,则结束;若大于父节点,则将新元素与父节点互换,继续重复2。
key:大根堆的插入,新元素一定插入堆底,插入后新元素一定不断上升;
堆的删除
1,删除元素后,用堆底元素代替被删除结点;
2,堆底元素不断进行下坠,直到符合大根堆/小根堆的要求。
总结:堆排序空间复杂度为常数级,O(1);时间复杂度为O(nlog2 n);堆排序不稳定,且只适用于顺序表;堆排序的插入与删除中,对于关键字的比较需要重点关注,考研经常容易考关于大小根堆插入删除的关键字比较:
当堆进行插入时,仅与父节点对比一次即可,如果小于父节点则结束插入步骤;如果大于当前父节点则与父节点互换,继续与父节点进行对比,直到结束或者该节点变为根结点。一般情况下堆插入时,关键字比较只比较一次。
当堆进行删除时,需要用最下方的结点代替被删除结点,然后将该结点逐渐下坠,达成大小根堆的要求。但是当下坠时,如果孩子结点为左右双结点,则需要先对比左右孩子,选择其中较大/小的一个,再与当前结点进行比较,关键字比较两次;如果孩子结点仅有一个,那么只需要将该结点与孩子结点进行比较,关键字比较一次;重复上述步骤,直到结束或者最终变为新的大/小根堆。一般情况下堆删除时,关键字比较可能比较一次,也可能比较两次。
本题手写过程截图如下: