数据结构复习要点(课后选择题)

第1章 绪论

1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位
数据对象:是性质相同的数据元素的集合,是数据的一个子集
数据结构:是相互之间存在一种或多种特定关系数据元素的集合
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。(比如学生的学号之间就是有顺序的,所以在逻辑结构上看是线性的)
存储结构:数据对象在计算机中的存储表示,也称为物理结构。(上面学生学号从逻辑结构上看是线性的,但是既可以用数组(顺序存储结构)来表示也可以用链式存储结构来表示。也就是说:相同的逻辑结构,可以对应不同的存储结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
数据(学生信息表)-数据元素(个人记录)-数据项(学号、姓名等)


2.简述逻辑结构的四种基本关系并画出它们的关系图。
(1)集合结构
数据元素之间除了“属于同一集合”的关系外,别无其他关系。
(2)线性结构
数据元素之间存在一对一的关系。
(3)树结构
数据元素之间存在一对多的关系。
(4)图结构或网状结构
数据元素之间存在多对多的关系。
树结构和图结构都属于非线性结构。
数据结构复习要点(课后选择题)_第1张图片


3.试分析下面各程序段的时间复杂度
数据结构复习要点(课后选择题)_第2张图片
解释:程序的执行次数为常数阶。
数据结构复习要点(课后选择题)_第3张图片
解释:语句a[i][j]=0;的执行次数为m*n。
数据结构复习要点(课后选择题)_第4张图片
解释:语句s+=B[i][j];的执行次数为n2。
数据结构复习要点(课后选择题)_第5张图片
数据结构复习要点(课后选择题)_第6张图片
数据结构复习要点(课后选择题)_第7张图片
解释:语句x++;的执行次数为n-1+n-2+……+1= n(n-1)/2。
数据结构复习要点(课后选择题)_第8张图片
数据结构复习要点(课后选择题)_第9张图片


第2章 线性表

1.在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( A )。
A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
B.在第i个结点后插入一个新结点(1≤i≤n)
C.删除第i个结点(1≤i≤n)
D.将n个结点从小到大排序
释:在顺序表中插入和删除一个结点的时间复杂度都是O(n),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。
顺序表的插入:

Status ListInsert(Sqlist &L,int i,ElemType e)
{
	//在顺序表第i个位置插入新元素e,i的合法范围是1<=i<=L.length
	if(i<1||i>L.length) return ERROR;
	if(L.length==Maxsize) return ERROR;
	for(j=L.length-1;j>=i-1;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i-1]=e;
	++L.length;
	return OK;
} 

顺序表的删除

Status ListDelete(Sqlist &L,ElemType e)
{
	if(i<1||i>L.length) return ERROR;
	for(j=i;j

2.单链表的存储密度( C )。
A.大于1 B.等于1 C.小于1 D.不能确定
解释:存储密度是指一个结点数据本身所占的存储空间和整个结点所占的存储空间之比,假设单链表一个结点本身所占的空间为D,指针域所占的空间为N,则存储密度为:D/(D+N),一定小于1。


3.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( A )。A.n B.2n-1 C.2n D.n-1
解释:当第一个有序表中所有的元素都小于(或大于)第二个表中的元素,只需要用第二个表中的第一个元素依次与第一个表的元素比较,总计比较n次。


4.创建一个包括n个结点的有序单链表的时间复杂度是( C )。
A.O(1) B.O(n) C.O(n2) D.O(nlog2n)
解释:单链表创建的时间复杂度是O(n),而要建立一个有序的单链表,则每生成一个新结点时需要和已有的结点进行比较,确定合适的插入位置,所以时间复杂度是O(n2)。


5.在单链表中,要将s所指结点插入到p所指结点之后,其语句应为( D )。
A.s->next=p+1; p->next=s;
B.(*p).next=s; (*s).next=(*p).next;
C.s->next=p->next; p->next=s->next;
D.s->next=p->next; p->next=s;
解释:先连后断


6.在双向链表存储结构中,删除p所指的结点时须修改指针( A )。
A.p->next->prior=p->prior; p->prior->next=p->next;
B.p->next=p->next->next; p->next->prior=p;
C.p->prior->next=p; p->prior=p->prior->prior;
D.p->prior=p->next->next; p->next=p->prior->prior;
数据结构复习要点(课后选择题)_第10张图片


第3章 栈和队列

1.若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在( C )种情况。
A.5,4,3,2,1
B.2,1,5,4,3
C.4,3,1,2,5
D.2,3,5,4,1
解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。
我的理解:C中先出4,那么说明5一定已经出栈了,接下来的就要按后进先出的顺序出栈。D中先出2,说明5、4、3都已经出栈了,所以5、4、3的顺序不用理,关注1的顺序。


2.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为( D )。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n
解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n


3.设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是(B )。
A.2 B.3 C.4 D. 6
解释:元素出队的序列是e2、e4、e3、e6、e5和e1,可知元素入队的序列是e2、e4、e3、e6、e5和e1,即元素出栈的序列也是e2、e4、e3、e6、e5和e1,而元素e1、e2、e3、e4、e5和e6依次进入栈,易知栈S中最多同时存在3个元素,故栈S的容量至少为3。
数据结构复习要点(课后选择题)_第11张图片


4.循环队列存储在数组A[0…m]中,则入队时的操作为( D)。
A. rear=rear+1
B. rear=(rear+1)%(m-1)
C. rear=(rear+1)%m
D. rear=(rear+1)%(m+1)
解释:数组A[0…m]中共含有m+1个元素,故在求模运算时应除以m+1。


5.最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是(B )。
A. (rear+1)%n == front
B. rear == front
C.rear+1 == front
D. (rear-l)%n == front
解释:最大容量为n的循环队列,队满条件是(rear+1)%n == front,队空条件是rear==front


第4章 串、数组和广义表

1.串下面关于串的的叙述中,( B )是不正确的?
A.串是字符的有限序列
B.空串是由空格构成的串
C.模式匹配是串的一种重要运算
D.串既可以采用顺序存储,也可以采用链式存储
解释:空格常常是串的字符集合中的一个元素,有一个或多个空格组成的串成为空格串零个字符的串成为空串,其长度为零


2.串的长度是指( B )。
A.串中所含不同字母的个数
B.串中所含字符的个数
C.串中所含不同字符的个数
D.串中所含非空格字符的个数
解释:串中字符的数目称为串的长度


3.假设以行序为主序存储二维数组A=array[1…100,1…100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( B )。
A.808 B.818 C.1010 D.1020
解释:以行序为主,则LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818。


4.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( B )。
A.BA+141 B.BA+180 C.BA+222 D.BA+225
解释:以列序为主,则LOC[5,8]=[(8-1)*8+(5-1)]*3+BA=BA+180。


5.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( C )。A.13 B.32 C.33 D.40
数据结构复习要点(课后选择题)_第12张图片

第5章 树和二叉树

1.把一棵树转换为二叉树后,这棵二叉树的形态是( A )。
A.唯一的
B.有多种
C.有多种,但根结点都没有左孩子
D.有多种,但根结点都没有右孩子
解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的形态是唯一的。


2.由3个结点可以构造出多少种不同的二叉树?( D )
A.2 B.3 C.4 D.5
数据结构复习要点(课后选择题)_第13张图片


3.一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D )。
A.250 B. 500 C.254 D.501
解释:设度为0结点(叶子结点)个数为A,度为1的结点个数为B,度为2的结点个数为C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉树的性质可得B=0或1,又因为C为整数,所以B=0,C=500,A=501,即有501个叶子结点。
本题考查二叉树的基本性质(我在树和二叉树的博客中有讲到)


4.一个具有1025个结点的二叉树的高h为( C )。
A.11 B.10 C.11至1025之间 D.10至1024之间
在这里插入图片描述
若要使得二叉树的高度最小,也就是使得该二叉树的深度最小,那么可以将这树变成一个完全二叉树,根据完全二叉树的特点:
在这里插入图片描述


5.深度为h的满m叉树的第k层有( A )个结点。(1= A.mk-1 B.mk-1 C.mh-1 D.mh-1
在这里插入图片描述
本道题可以用特殊值法求解。


6.利用二叉链表存储树,则根结点的右指针是( C )。
A.指向最左孩子 B.指向最右孩子 C.空 D.非空
解释:利用二叉链表存储树时,右指针指向兄弟结点,因为根节点没有兄弟结点,故根节点的右指针指向空。
本道题考查普通树如何转换成二叉树并用二叉链表法进行存储。


7.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C )遍历实现编号。
A.先序 B. 中序 C. 后序 D. 从根开始按层次遍历
解释:根据题意可知按照先左孩子、再右孩子、最后双亲结点的顺序遍历二叉树,即后序遍历二叉树。
注意题目:是按照后序遍历来进行编号可以达到效果。


8.若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用( C )遍历方法最合适。
A.前序 B.中序 C.后序 D.按层次
解释:后续遍历和层次遍历均可实现左右子树的交换,不过层次遍历的实现消耗比后续大,后序遍历方法最合适。


9.树的存储结构有三种:双亲表示法、孩子表示法、孩子兄弟表示法,其中孩子兄弟表示法是常用的表示法,任意一棵树都能通过孩子兄弟表示法转换为二叉树进行存储。


10.设哈夫曼树中有199个结点,则该哈夫曼树中有( B )个叶子结点。
A.99 B.100
C.101 D.102
解释:**在哈夫曼树中没有度为1的结点,只有度为0(叶子结点)和度为2的结点。**设叶子结点的个数为n0,度为2的结点的个数为n2,由二叉树的性质n0=n2+1,则总结点数n= n0+n2=2*n0-1,得到n0=100。
哈弗曼树的具体性质以及如何求解,在博客《快速掌握哈弗曼树》中有讲解。


11.若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为( C )。
A.X的双亲 B.X的右子树中最左的结点
C.X的左子树中最右结点 D.X的左子树中最右叶结点


12、引入二叉线索树的目的是加快查找结点的前驱或后继的速度


13.设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有( C )个。
A.n−1 B.n C.n + 1 D.n + 2


14.设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有( C )个。
A.n−1 B.n C.n + 1 D.n + 2
个人感觉,这道题不要硬推,举一个特殊的例子就可以了。关键是要知道怎么将一个森林转换成一个二叉树。转换方法在《树和二叉树》中有讲解


15.n(n≥2)个权值均不相同的字符构成哈夫曼树,关于该树的叙述中,错误的是( A)。
A.该树一定是一棵完全二叉树
B.树中一定没有度为1的结点
C.树中两个权值最小的结点一定是兄弟结点
D.树中任一非叶结点的权值一定不小于下一层任一结点的权值
解释:哈夫曼树的构造过程是每次都选取权值最小的树作为左右子树构造一棵新的二叉树,所以树中一定没有度为1的结点、两个权值最小的结点一定是兄弟结点、任一非叶结点的权值一定不小于下一层任一结点的权值。


第6章 图

1.在一个图中,所有顶点的度数之和等于图的边数的( C )倍。
A.1/2 B.1 C.2 D.4


2.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( B)倍。
A.1/2 B.1 C.2 D.4
解释:有向图所有顶点入度之和等于所有顶点出度之和。


3.具有n个顶点的有向图最多有( B )条边。
A.n B.n(n-1) C.n(n+1) D.n^2
解释:有向图的边有方向之分,即为从n个顶点中选取2个顶点有序排列,结果为n(n-1)。【注意和无向图的区别】


4.n个顶点的连通图用邻接距阵表示时,该距阵至少有( B )个非零元素。A.n B.2(n-1) C.n/2 D.n2
解释:n个顶点至少需要n-1条线来构成连通图,但由于邻接矩阵是分上三角和下三角的,所以是2(n-1)个非0元素。


5.G是一个非连通无向图,共有28条边,则该图至少有(C )个顶点。
A.7 B.8 C.9 D.10
解释:8个顶点的无向图最多有8*7/2=28条边,再添加一个点即构成非连通无向图,故至少有9个顶点。


6.若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是( B )图。
A.非连通 B.连通 C.强连通 D.有向
解释:即从该无向图任意一个顶点出发有到各个顶点的路径,所以该无向图是连通图。


7.下面( A)算法适合构造一个稠密图G的最小生成树。
A. Prim算法 B.Kruskal算法 C.Floyd算法 D.Dijkstra算法
解释:Prim算法适合构造一个稠密图G的最小生成树,Kruskal算法适合构造一个稀疏图G的最小生成树。


8.用邻接表表示图进行广度优先遍历时,通常借助( B )来实现算法。A.栈 B. 队列 C. 树 D.图
解释:广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。


9.下面( B )方法可以判断出一个有向图是否有环。
A.深度优先遍历 B.拓扑排序 C.求最短路径 D.求关键路径


第7章 查找

1.对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( C )。
A.(n-1)/2 B. n/2 C.(n+1)/2 D.n
解释:总查找次数N=1+2+3+…+n=n(n+1)/2,则平均查找长度为N/n=(n+1)/2。


2.折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。


3.分块查找的优点是:在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。由于块内是无序的,故插入和删除比较容易,无需进行大量移动。如果线性表既要快速查找又经常动态变化,则可采用分块查找。


4.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。若查找表中元素58,则它将依次与表中( A)比较大小,查找结果是失败。
A.20,70,30,50 B.30,88,70,50
C.20,50 D.30,88,50
在这里插入图片描述


5.对22个记录的有序表作折半查找,当查找失败时,至少需要比较( B )次关键字。
A.3 B.4 C.5 D.6
在这里插入图片描述


6.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( C )。
A.(100,80, 90, 60, 120,110,130)
B.(100,120,110,130,80, 60, 90)
C.(100,60, 80, 90, 120,110,130)
D.(100,80, 60, 90, 120,130,110)
解释:A、B、C、D四个选项构造二叉排序树都以100为根,易知A、B、D三个序列中第一个比100小的关键字为80,即100的左孩子为80,而C选项中100的左孩子为60,故选C。


7.设哈希表长为14,哈希函数是H(key)=key%11,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为49的元素加到表中,用二次探测法解决冲突,则放入的位置是( D )。
A.8 B.3 C.5 D.9
解释:关键字15放入位置4,关键字38放入位置5,关键字61放入位置6,关键字84放入位置7,再添加关键字49,计算得到地址为5,冲突,用二次探测法解决冲突得到新地址为6,仍冲突,再用用二次探测法解决冲突,得到新地址为4,仍冲突,再用用二次探测法解决冲突,得到新地址为9,不冲突,即将关键字49放入位置9。
数据结构复习要点(课后选择题)_第14张图片


8.采用线性探测法处理冲突,可能要探测多个位置,在查找成功的情况下,所探测的这些位置上的关键字 ( A )。
A.不一定都是同义词 B.一定都是同义词
C.一定都不是同义词 D.都相同
解释:所探测的这些关键字可能是在处理其它关键字冲突过程中放入该位置的。


第8章 排序

1.从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为( C )。
A.归并排序 B.冒泡排序 C.插入排序 D.选择排序


2.从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为( D )。
A.归并排序 B.冒泡排序 C.插入排序 D.选择排序


3.对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为( D )。A.n+1 B.n C.n-1 D.n(n-1)/2
解释:比较次数最多时,第一次比较n-1次,第二次比较n-2次……最后一次比较1次,即(n-1)+(n-2)+…+1= n(n-1)/2。(例如如果需要从小到大排序,但是序列初始是从大到小排序,那么这样的比较次数是最多的。)


4.快速排序在被排序的数据完全无序情况下最易发挥其长处被排序的数据已基本有序是快速排序最坏的情况


5.对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是( B )。
A.O(n) B.O(n^2) C.O(nlog2n) D.O(n3)
解释:快速排序的平均时间复杂度为O(nlog2n),但在最坏情况下,即关键字基本排好序的情况下,时间复杂度为O(n^2)


6.若一组记录的排序码为(46, 79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( C )。
A.38,40,46,56,79,84 B.40,38,46,79,56,84C.40,38,46,56,79,84 D.40,38,46,84,56,79
数据结构复习要点(课后选择题)_第15张图片


7.堆是一种( B )排序。
A.插入 B.选择 C.交换 D.归并


8.堆的形状是一棵(C )。
A.二叉排序树 B.满二叉树 C.完全二叉树 D.平衡二叉树


9.若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为( B )。
A.79,46,56,38,40,84 B.84,79,56,38,40,46 C.84,79,56,46,40,38 D.84,56,79,40,46,38


10.在希尔排序、快速排序、归并排序、堆排序中要求内存最大的是归并排序,最稳定的是归并排序。


11.数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用( D )算法最节省时间。
A.冒泡排序 B.快速排序 C.简单选择排序 D.堆排序
解释:大根堆


12.快速排序的每趟排序能将作为枢轴的元素放到最终位置;冒泡排序的每趟排序能将最大或最小的元素放到最终位置;堆排序的每趟排序能将最大或最小的元素放到最终位置。

你可能感兴趣的:(数据结构复习要点(课后选择题))