2020 北京理工大学889 回忆
该回忆版由(492030260)群内小伙伴讨论回忆出来的,我代为整理,除非搞到原题,任何考研机构不可能比我们这个更全,希望大家购买所谓真题的时候理性消费。
其中选择的第4题,第12题,填空的第1题,比较有歧义,不保证回忆和答案的正确性。其他题目或者答案如果有问题,或者你回想起了其他的题目或者题目细节,欢迎在评论区写出、群里@我或者直接私聊我。再次感谢!!!!
转载请注明出处 :https://www.cnblogs.com/xuwangzihao/p/12081845.html
选择题20个
1,给你入栈顺序123,出栈顺序231,问你操作序列。(push、push、pop、push、pop、pop)
2,下列哪个说法错误:
A 对称矩阵的存储只需要存主对角线和上三角或下三角
B 对角矩阵不用存储零【对角线上可能有零】
C 稀疏矩阵可以用三元组
D 稀疏矩阵有分布规律,可以用三元组
3,给了一循环队列A[0……30],rear指向队尾元素,front指向队头元素的前一个位置,存储了11个元素,当前front指向25,求rear指针位置。(5)
4,有一个无向图,每个边值不同,问下列哪一个选项是错的。
A 生成树不一定唯一
BC很简单,不记得了。。。
D 两节点的最短距离一定是最小生成树上的两节点最短距离
5,一个外层循环n,内层循环2n的程序,问你时间复杂度。(O(n^2))(注意不要选O(2n^2),渐进复杂度省略常数)
A O(2n) B O(n)
C O(2n^2) D O(n^2)
6,二维矩阵的压缩方式:(答案应该是十字链表和三元组,不要选散列和邻接表)
7,请选出排序算法的启动时间最少的算法,所谓启动时间就是说选出第一个元素的最终位置所花的时间。
A 归并排序 B 堆排序
C 插入排序 D 快速排序
8,下列哪个空间复杂度不是常数:
A 归并排序 B 堆排序
C 快速排序 D 置换-选择排序
9,顺序表下列哪个操作平均复杂度与众不同。
A 删除元素a B 查找元素a
C 求表长 D 在第i个元素后插入
10,给你一个图,问你哪个dfs序是不可能的(简单题,没啥说的)
11,给你一个 [1..5, 1..5] 上三角矩阵,问你压缩成一维后(下标从零开始),在行优先的情况下,a33的下标。(9)
12,关于m阶b树性质,下列哪个错误:(每个节点最少有2个子树,注意根节点为叶子结点的情况)
A 每个节点最少有2个子树
B 每个节点最多m-1关键字
C 叶节点都在同一层
D 记录是有序的
13,中序线索二叉树的后继不可能是:
A 祖先 B 兄弟 C 右孩子的左子树 D 儿子
14,问你抽象数据类型说法错误的是:(D 用户可以看外面,也能清楚看到内部算法过程)
15,给你一个序列,问你折半查找某个不存在的数字的比较次数。(简单题)
16,对于一个森林来说,以孩子兄弟表示法表示,那么对于森林中的叶子节点,在孩子兄弟表示法中应该是()
A 没有左孩子 B 没有右孩子
C 有左孩子,没有右孩子 D 既没有左孩子也没有右孩子
17,n个节点的正则(完全)二叉树,分支节点个数为?
A n/2 B (n-1)/2 C (n+1)/2 D n
18,给了四个序列问哪个不是折半查找的查找序列。(简单题,只要保证搜索范围在不断缩小就行,比如目标是12,你之前已经比较过10和14了,这时候序列出来个8,那明显就不是折半查找的查找序列了)
19,给了四个序列问哪个既不是大根堆,也不是小根堆。(简单题,选项里有一个 83 82 84,83两个孩子一大一小,那肯定错了啊)
填空题15个题,20个空
1,给了一个hash函数和输入序列,问你某一个值在表中的key是什么,问你平均查找长度。(这题第一问简单,第二问。。。可能要把成功查找的平均值和不成功的平均值再求平均)
2,问你100个数字归并排序需要几趟(7)
3,给你前序中序求层次遍历。(简单题)
4,基数排序的步骤:(分配)和收集
5,给你一个序列,问步长为3的一趟希尔排序后是什么样(简单题)
6,5层(不含叶子结点层)3阶B树结点最多 121 个,最少 31 个。
7,在二叉搜索树中删除u,已知u的祖先是p,u只有左子树s。操作是:p->lc=s,s->parent=p;然后释放u的空间。
8,给你一个avl的插入序列(10,9,15,12,11),问你它旋转后的树的层次遍历。(10,9,12,11,15)
9, 一个n个节点的完全二叉树只有一个叶子结点的点是第几个点。(n/2)
10,单链表中删除q的后继结点的操作(q->next=q->next->next)
11,给你一个hash函数x%7,和几个数,问你能和48映射在同一位置的数字是(62)
12,广义表((a),(((b)),c),(d)),求长度:3,深度:4,表头:(a),表尾((((b)),c),(d)):
13,森林的后序遍历是树的 中 序遍历
14,给你一个序列(1,2,3,4,5),问你折半查找数字2所用的比较次数为2次。
简答题4个
1,给你中序和层次遍历,让你画出那个树,并写出前续和中序。
简单题,没啥说的
2,已知L是单向循环链表,长度大于4,p1p2为指向其中两个不同节点的指针,问你A程序的意思和复杂度。
1 void A(L, p1, p2){ 2 3 B(p1,p2); 4 5 B(p2,p1); 6 7 } 8 9 void B(LNode *s, LNode *e){ 10 11 LNode *p=s; 12 13 while(p->next!=e)p=p->next; 14 15 p->next = s; 16 17 }
A的功能是把循环链表L在p1和p1的前缀处切开、p2和p2的前缀处切开,分割成两个单向循环链表。复杂度是O(n)
3,有两个小问:
1,一个50个点,100条边的无向图,点信息20字节,边信息10字节,邻接信息4字节,n、m、type各8字节,用邻接矩阵表示,问你存储这个图要花多少字节。
50*20+50*50*(10+4)+3*8
2,问你邻接表存储的无向图求连通分量的复杂度分析。
时间复杂度:O(n+e)。因为要DFS每一个节点,且每个边都访问一遍。
空间复杂度:O(n)。因为要开染色标记的辅助数组,如果DFS是递归实现,还要用深度为n的系统栈。
4,给你14个带权重的字母,设计一种三进制编码。
构造三叉哈夫曼树,没啥好说的,唯一要注意的点是要加一个权重为0的空节点。因为:(n-1)%(m-1)=(14-1)(3-1)=1。我一开始忘加了,写完才发现不对,浪费了15分钟。
算法题3个:
1,现有一字符数组S,其中存储的是从a到z的小写字母。设计一个算法,对该字符数组进行重新排列,使得所有的字母‘a’都放在前面,其他字母放在a后面,请分析你设计的算法的时间复杂度。
void MaxAFront(char S[],int n);
提供两种思路:
1,用‘a’做轴,做一趟快排,把小于等于的放左,大于的放右
2,两个指针pq,p指向0,q遍历,遇到一个a就交换pq指向的元素然后p++
2,一个有表头节点的单链表l。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k(k为正整数)个节点。若查找成功,输出该节点的data值,并return 1,否则return 0.
int KtoLast(LinkList L,int k)
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList
提供三种思路:
1,两个指针pq,先让p走k步,然后pq一起走,如果p指向空,那么q就是倒数第k个元素。
2,计算表长n,然后输出正向第n-k+1个元素
3,递归,返回值是当前层深度,回溯的时候就可以判断是否为倒数第k个。
这题要注意两个坑,
一个是列表长度可能小于k,那就是无解。
一个是不允许改变链表,也就是说不能用“反转、取正向第K个、再转回来”的算法。
3,二叉树t中,每个节点都拥有一个权值(正整数),请设计一个递归算法,求T中所有叶子权值的最大值,假设函数定义如下。
int MaxLeafValue(BiTree T)
typedef struct BiTNode{
int w;
struct BiTNode *lchild,*rchild;
}BiTNode.*BiTree
int MaxLeafValue(BiTree T){
if(!T) return 0;
if(!T->lchild&&!T->rchild) return T->w;
return max(MaxLeafValue(T->lchild), MaxLeafValue(T->rchild));
}