刷题十五天

1:有以下5个叶子节点1,1,3,2,5构成的哈夫曼树的带权路径长度为(D)
A:24
B:26
C:23
D:25
解析:
在这里插入图片描述
2:某表达式的前缀形式为"±*^ABCD/E/F+GH",它的中缀形式为©
A:A^B*C-D+E/F/G+H
B:A^B*(C-D)+(E/F)/G+H
C:A^B*C-D+E/(F/(G+H))
D:A^B*(C-D)+E/(F/(G+H))
解析:
先找^AB转换为A^B
再找*和C转换成A^B*C
再找-和D转换成A^B*C-D
再找+GH转换成G+H
……
3:能在O(1)时间内访问线性表的第i个元素的结构是(A)
A:顺序表
B:单链表
C:单项循环表
D:双向链表
解析:顺序表能随机存取任意元素。
4:有n-1条边的图肯定都是生成树(B)
A:对
B:错
解析:前提是不构成回路。
5:若已知一棵二叉树的前序遍历序列和后序遍历序列,则可以恢复该二叉树,这样的说法正确吗(B)
A:正确
B:不正确
解析:已知中序和前序或者中序和后序可以推出另外一种,前序和后序无法确定
6:N个结点的二叉排序树有多种,其中树高最小的二叉排序树是最佳的(A)
A:对
B:错
解析:二叉排序树的主要用途是链式存储结构的二分查找,查找的最坏次数是树的高度,因此高度最小的二叉排序树是最佳的
7:以下 C 语言指令:
int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(“%d,%d”,*(a+1) , *(p-1));
运行结果是什么(C)
A:2,1
B:3,1
C:3,9
D:运行时崩溃
解析:&a表示一个指向大小为5数组的指针,那么(&a+1)就是表示一个指向大小为5的下一个数组的指针, 也就是数组a最后一个元素的下一个位置,-1则指向a中最后一个元素;a是保存数组的首地址,*(a+1)保存的是数组第二个地址的值,故为3.p是保存数组a最后一个位置的下一个位置的地址,*p是指向数组a最后一个位置的下一个位置,值为-1,*(p-1)是指向数组a最后一个位置,值为9.
8:若有说明:a[3][4];,则数组 a 中和元素(C)
A:可在程序的运行阶段得到初值 0
B:可在程序的编译阶段得到初值 0
C:数组 a 的初值无法确定
D:可在程序的编译或运行阶段得到初值 0
解析:int a[3][4]定义了数组但未赋初值,系统为所定义的数组在内存中开辟了已连续的存储单元,但这些存储单元中没有确定的值
9:以下哪些算法是可以用来求最小生成树(AD)
A:kruskal算法
B:dijkstra算法
C:floyd算法
D:prim算法
解析
Kruskal算法(适合稀疏图,贪心算法的运用,时间复杂度O(eloge),e为边数)
Prim算法适合稠密图,贪心算法的应用,时间复杂度为O(n+e),临接表存储
B和C是求最短路径的算法
10:选项代码中能正确操作数组元素的是(AB)

int main(){
int a[N][N]={{0,0},{0,0}};
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			//访问二维数组a的值
			//选项代码
		}
	}
}

A:*(*(a+i)+j)=1
B:*(a[i]+j)=1
C:**(a+i)[j]=1
D:*((a+i)+j)=1
解析:数组名当被直接使用时,是一个指向数组首地址的指针。如果数组是多维数组,那么数组名是指向第一行数组的首地址,而不是第一行第一列单个元素的地址,所以*(a+i)与a[i]是一个意思,当直接用a[i]时代表的是该一维数组的首地址,所以*(a[i]+j)是与a[i][j]等效,所以AB选项正确

猜你喜欢

转载自blog.csdn.net/g_l_xz/article/details/83385570