C.ki≤k2i且ki≤k2i+1(2i+1≤n)D.ki≤k2i或ki≤k2i+1(2i+1≤n)
(1)以下四类基本的逻辑结构反映了四类基本的数据组织形式,解释错误的是(A)
A、集合中任何两个结点之间都有逻辑关系但组织形式松散
B、线性结构中结点按逻辑关系依次排列形成一条"锁链"
C、树形结构具有分支、层次特性,其形态有点像自然界中的树
D、图状结构中的各个结点按逻辑关系互相缠绕,任何两个结点都可以邻接
(2)若各元素的逻辑顺序与其存放的物理顺序一致,则称这种存储结构为(A)
A、顺序存储结构B、链式存储结构
C、索引存储结构D、散列存储结构
(3)在长度为n的顺序表的第i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数为(A)
A、n-i+1B、n-iC、iD、i-1
(4)对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为(C)
A、顺序表B、用头指针表示的单循环链表
C、用尾指针表示的单循环链表D、单链表
(5)一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是(C)
A、edcbaB、decbaC、dceabD、abcde
(1)若需要利用形参直接访问实参,则应把形参变量说明为(B)参数。
A.指针B.引用C.传值D.常值
(2)如果以链表作为栈的存储结构,则退栈操作时(C)
A.必须判别栈是否满B.对栈不作任何判别
C.C.必须判别栈是否空D.判别栈元素的类型
(3)设有一个n⨯n的对称矩阵A,将其上三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第i行的对角元素A[i][i]存放于B中(C)处。
A.(i+3)*i/2B.(i+1)*i/2C.(2n-i+1)*i/2D.(2n-i-1)*i/2
(4)已知单链表A长度为m,单链表B长度为n,若将B联接在A的末尾,其时间复杂度应为(B)。
A.O
(1)B.O(m)
C.O(n)D.O(m+n)
(5)假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为(D)。
A.front==rearB.front!
=NULL
C.rear!
=NULLD.front==NULL
(6)在一棵高度为h(假定树根结点的层号为0)的完全二叉树中,所含结点个数不小于(D)。
A.2h-1B.2h+1C.2h-1D.2h
(7)由a,b,c3个结点构成的二叉树,共有(C)种不同的结构。
(A)3(B)4(C)5(D)6
(8)向具有n个结点的、结构均衡的二叉排序树中插入一个元素的时间复杂度大致为(B)。
A.O
(1)B.O(log2n)C.O(n)D.O(nlog2n)
(9)具有n个顶点的有向无环图最多可包含(C)条有向边。
A.n-1B.nC.n(n-1)/2D.n(n-1)
(6)已知图1如右所示,若从顶点A出发按深度优先搜索进行遍历,则可能得到的顶点序列为(D)
A、A,B,E,C,D,FB、A,C,F,E,B,D
C、A,E,B,C,F,DD、A,E,D,F,C,B
(7)n个顶点的有向图中含有向边的数目最多为(D)
A、n-1B、nC、n(n-1)/2D、n(n-1)
(8)向具有n个结点的、结构均衡的二叉搜索树中删除一个元素的时间复杂度大致为(B)。
A.O
(1)B.O(log2n)C.O(n)D.O(nlog2n)
(9)由a,b,c3个结点构成的二叉树,共有(C)种不同的结构。
(A)3(B)4(C)5(D)6
(1)在计算递归函数时,如不使用递归过程,则一般情况下必须借助于(D)数据结构。
(A)队列(B)广义表(C)二叉树(D)栈
(2)一个队列的输入序列是adcb,则队列的输出序列是(A)。
(A)adcb(B)bcda(C)dcba(D)cbad
(3)有32个结点的完全二叉树的深度为(C)(根的层次为1)。
(A)8(B)7(C)6(D)5
(4)一个栈的输入序列为12345,则下列序列中不可能是栈的输出序列是(B)。
(A)23415(B)54231(C)23145(D)15432
(5)非空的单循环链表L的尾结点p满足条件为(C)。
(A)p->next==null(B)p==null(C)p->next==L(D)p==L
(6)栈操作的原则是(B)。
(A)先进先出(B)后进先出(C)只能进行插入(D)只能进行删除
(7)设某完全无向图中有n个顶点,则该完全无向图中有(A)条边。
(A)n(n-1)/2(B)n(n-1)(C)n2(D)n2-1
(8)下列四种排序中(A)的空间复杂度最大。
(A)快速排序(B)冒泡排序(C)希尔排序(D)堆
(9)设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为(D)。
(A)O(log2n)(B)O
(1)(C)O(n2)(D)O(n)
(1)在无向图中,定义顶点Vi与Vj之间的路径为从Vi到达Vj的一个(A)。
(A)顶点序列(B)边序列(C)权值总和(D)边的条数
(2)设键字序列为3,7,6,9,8,1,4,5,2,则对它们进行排序的最小交换次数是(C).
(A)8 (B)7 (C)6 (D)9
(3)如果只想到1024个元素组成的序列中前5个最小元素,那么用(C)方法最快。
(A)起泡排序(B)快速排序(C)堆排序(D)直接选择排序
(4)设有一个栈,元素的进栈顺序为A,B,C,D,E,(C)是不可能的出栈序列.
(A)ABCDE (B)BCDEA(C)EABCD (D)EDCBA
(5)一个具有n个顶点的无向图中,要连通全部顶点至少需要(D)条边。
(A)n(B)n+1(C)n/2(D)n-1
(6)串的逻辑结构与(D)的逻辑结构不同。
(A)线性表(B)栈(C)队列(D)树
(7)已知8个元素(34,76,45,18,26,54,92,65),按照依次插入结点的方法生成一棵二叉排序树,该树的深度为(B)。
(A)4(B)5(C)6(D)7
(8)在一棵度为3的树中,度为3的结点个数为2,度为2的结点个数为1,则度为0的结点个数为(C).
(A)4(B)5(C)6(D)7
(9)对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为(C)
A、顺序表B、用头指针表示的单循环链表
C、用尾指针表示的单循环链表D、单链表
一、填空题
(1)若已知一个栈的输入序列为1,2,3,...n,其输出序列为p1,p2,p3,....pn。
若p1=n,则pi为n-i+1。
(2)按照二叉树的定义,具有3个结点的二叉树有5种
(3)从逻辑关系上讲,数据结构主要分为两大类,它们是线性与非线性。
(4)带有头结点的单链表L中,第一个元素结点的指针是L->next或L->link。
(5)已知完全二叉树的第八层有8个结点,则其叶子结点数是68。
(6)一个长度为20的有序表采用二分查找方法进行查找,共有4个元素的查找长度为3。
(7)G为无向图,如果从G的某个顶点出发,进行一次广度优先搜索,即可访问图的每个顶点,则该图一定是连通图。
(8)栈顶的位置是随着出栈和入栈操作而变化的。
(9)在有序表(12,24,36,48,60,72,84)中二分查找关键字72时所需进行的关键字比较次数为2。
(1)前序遍历序和中序遍序列相同的二叉树为没有左子树的二叉树
(2)具有64有结点的完全二叉树的深度为7。
(3)已知一个有序表为(13,18,24,35,47,50,62,83,90,115,134),当二分检索值为90的元素时,需2次比较可检索成功。
(4)在带有头结点的单链表L中,若要删除第一个结点,则需执行下列三条语句:
U=L->next;L->next=U->next;delete(U);
(5)采用冒泡排序对有n个记录的表A按键值递增排序,若A的初始状态是按键值递增,则排序过程中记录的交换次数为0次。
(6)对于一个长度为n的单链接存储线性表,在表尾插入元素的时间复杂度为 O(n)
(7)n(n﹥0)个顶点的无向图最多有_n(n-1)/2条边。
(8)设一组初始记录关键字序列为(20,18,22,16,30,19),则以20为中轴的一趟快速排序结果为(19,18,16,20,30,22)。
(9)设前序遍历某二叉树的序列为ABCD,中序遍历该二叉树的序列为BADC,则后序遍历该二叉树的序列为_BDCA。
(1)存储结构是逻辑结构的_物理__实现。
(2)在单链表中,指针p所指结点为最后一个结点的条件是_p->next=NULL。
(3)在无向图的邻接矩阵A中,若A[i,j]等于1,则A[j,i]等于_1_。
(4)对带有头结点的链队列lq,判定队列中只有一个数据元素的条件是_lq->next->next=NULL_。
(5)设数组data[0..m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front的值为(front+1)%(m+1)。
(6)设有顺序栈s[0..m-1],若栈底设在下标最小的一端,则栈满的条件是top=m-1(设栈顶指针为top,指向栈顶元素的位置)。
1) 数据结构的存储结构包括顺序、_链式_、索引和散列等四种。
(2) 在程序运行过程中可以扩充的数组是_动态_分配的数组。
这种数组在声明它时需要使用数组指针。
(3)在链表中进行插入和删除操作的效率比在顺序存储结构中进行相同操作的效率高。
(4)栈是一种限定在表的一端进行插入和删除的线性表,又被称为_后进先出的线性_表。
(5)在一棵树中,_叶子_结点没有后继结点。
(6)若对一棵二叉树的结点编号从0开始顺序编码,按顺序存储,把编号为0的结点存储到a[0]中,其余类推,则a[i]元素的左孩子元素为_a[2i+1]_。
(7)一棵树按照左子女-右兄弟表示法转换成对应的二叉树,则该二叉树中树根结点肯定没有_右_子女。
(8)向一棵二叉排序树中插入一个元素时,若元素的值小于根结点的值,则应把它插入到根结点的_左子树_上。
(9)设图G=(V,E),V={1,2,3,4},E={<1,2>,<1,3>,<2,4>,<3,4>},从顶点1出发,对图G进行广度优先搜索的序列有_2_种。
(7)在链表中进行插入和_删除_操作的效率比在顺序存储结构中进行相同操作的效率高。
(8)在序列(2,5,8,11,15,16,22,24,27,35,40)中采用折半查找,查找元素11,需进行_3_次元素之间的比较。
(9)深度为h的完全二叉树至少有_2h-1_个结点。
(1)设r指向单链表的最后一个结点,要在最后一个结点之后插入s所指的结点,需执行的三条语句是r->next=s;r=s;r->next=null;。
(2)在单链表中,指针p所指结点为最后一个结点的条件是p->next=NULL。
(3)设一个链栈的栈顶指针是ls,栈中结点格式为info|link,.如果栈不为空,则退栈操作为p=ls;_ls=ls->link_;deletep;。
(4)已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树中有_12_个叶子的结点。
(5)树有三种常用的存储结构,即孩子链表法、孩子兄弟链表法和_双亲链表法_.
(6)N个顶点的连通图的生成树有_n-1_条边。
(7)在一棵树中,_叶子_结点没有后继结点。
(8)设表中元素的初始状态是无序的,分别用堆排序、快速排序、冒泡排序和归并排序方法对其进行(按递增排序),_冒泡排序_最费时间。
(9)归并排序在平均情况下的空间复杂度为_O(n)_。
三、判断题
(1)对无序表用二分法查找比顺序查找快(X)
(2)快速排序总比其它排序快。
(X)
(3)在查找树(二叉树排序树)中插入一个新结点,总是插入到叶结点下面。
(X)
(4)二维数组可以视为数组元素为一维数组的一维数组。
(V)
(5)链接存储表示的存储空间一般在程序的运行过程中动态分配和释放,通常存储器中还有空闲存储空间,就不会产生存储溢出的问题。
(V)
(6)在用单链表表示的链式队列中,队头在链表的链尾位置。
(X)
(7)凡是递归定义的数据结构都可以用递归算法来实现它的操作。
(V)
(8)当向一个小根堆(最小堆)中插入一个具有最小值的元素时,该元素不需要逐层向上调整,直接放到堆顶位置上。
(V)
(9)冒泡排序排序的时间复杂性为
(V)
(1)折半搜索只适用于有序表,包括有序的顺序表和有序的链表。
(X)
(2)具有n个结点的完全二叉树的高度为
。
(V)
(3)顺序表用一维数组作为存储结构,因此顺序表是一维数组。
(X)
(4)线性表若采用链式存储表示,在删除时不需要移动元素.(V)
(5)在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行中序遍历和后序遍历,则具有相同的结果.(V)
(6)假定有两个用单链有序表表示的集合,则这两个集合的交运算可得到一个新的集合单链表,其长度小于等于参加运算的任意一个集合单链表的长度.(V)
(7)存储无向图的邻接矩阵是对称的,因此可以只存储邻接矩阵的下(上)三角部分.(V)
(1)数据的逻辑结构是指各数据元素之间的逻辑关系,是用户根据应用需要建立的。
(V)
(2)顺序表和一维数组一样,都可以按下标随机(或直接)访问。
(V)
(3)在一个顺序存储的循环队列中,队头指针指向队头元素的后一个位置。
(X)
(4)用非递归方法实现递归算法时一定要使用递归工作栈。
(V)
(5)在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行中序遍历和后
序遍历,则具有相同的结果。
(V)
(6)串的长度是串中所含字母的个数n(n≧0)。
(X)
(7)设有100个元素有序排列,用二分折半检索法检索时,最少比较次数是1,最大比较次数为10。
(X)
(8)对具有n个元素的待排序序列进行归并排序时,需归并的趟数为[㏒2n]。
(V)
(9)凡是递归定义的数据结构都可以用递归算法来实现它的操作。
(V)
(8)如果有向图中各个顶点的度都大于2,则该图中必有回路.(X)
(9)数组是一种静态的存储空间分配,就是说,在程序设计时必须预先定义数组的数据类型和存储空间大小,由编译程序在编译时进行分配.(X)
(1)进行折半搜索的表必须是顺序存储的有序表。
(V)
(2)一棵具有n个结点,其高度为h的二叉树,任一种次序遍历的时间复杂度为O(n)。
(V)
(3)链式栈与顺序栈相比,一个明显的优点是通常不会出现栈满的情况.(V)
(4)假定有两个用单链有序表表示的集合,则这两个集合的差运算可得到一个新的集合单链表,其长度小于参加运算的任意一个集合单链表的长度.(X)
(5)对于同一组记录,生成二叉搜索树的形态与插入记录的次序无关.(X)
(6)存储无向图的邻接矩阵是对称的,因此可以只存储邻接矩阵的下(上)三角部分.(V)
(7)直接选择排序是一种稳定的排序方法.(X)
(8)若将无序的数据按堆结构组织起来,则堆中数据必然按从小到大的顺序线性排列(X)
(9)在顺序表中,逻辑上相邻的元素在物理位置上不一定相邻.(X)
(1)双链表中至多只有一个结点的后继指针为空。
(V)
(2)对链表进行插入和删除操作时,不必移动结点。
(V)
(3)栈可以作为实现程序设计语言过程调用时的一种数据结构。
(V)
(4)对有向图G,如果从任一顶点出发进行一次深度优先或广度优先搜索就能访问每个顶点,则该图一定是完全图。
(X)
(5)“顺序查找法”是指在顺序表上进行查找的方法。
(X)
(6)设有100个元素有序排列,用二分折半检索法检索时,最少比较次数是1,最大比较次数为10。
(X)
(7)对具有n个元素的待排序序列进行归并排序时,需归并的趟数为[㏒2n]。
(V)
(8)当向一个大根堆(最大堆)中插入一个具有最大值的元素时,该元素需要逐层向上调整,直到被调整到堆顶位置为止。
(X)
(9) 数组是一种复杂的数据结构,数组元素之间的关系既不是线性的也不是树形的。
(X)
四、分析题
(1)已知带权图的邻接表如下所示,其中边表结点的结构为:
依此邻接表从顶点C出发进行深度优先遍历。
1)画出由此得到的深度优先生成树;
(2)将下列由三棵树组成的森林转换为二叉树。
(只要求给出转换结果)
答案:
(1)对关键字序列(56,20,23,75,29,61,36,87)进行堆排序,使之按关键字递增次序排列,请写出排序过程中建初始堆的过程。
(1).已知二叉树的先序序列和中序序列分别为HDACBGFE和ADCBHFEG。
1)画出该二叉树;
(2)以数据集(17,9,2,6,3,24,10)为叶结点的权值,构造一棵哈夫曼树。
五、算法设计题
(1)设计一个算法,在给定的顺序表A中查找出具有最大值和最小值的整数。
函数的原型如下所示,原型的参数表中给出顺序表对象为A,通过执行算法,从参数表中的引用参数Max中得到表中的最大整数,Min中得到表中的最小整数。
注意,函数中可使用顺序表的如下两个公有函数:
intLength();求表的长度;
intgetData(intk);提取第k个元素的值。
#include“SeqList.h”
template
voidFindMaxMin(SeqList&A,int&Max,int&Min)
{}
答案:
#include”Seqlist.h”
template
voidFindMaxMin(SeqList&A,int&Max,inl&Min)
{
Max=Min=A.getData(0);
for(inti=1;i{
if(A.getData(i)>Max)
Max=A.getData(i);
elseif(A.getData(i)Min=A.geyData(i);
}
}
2设有一个表头为first的单链表。
根据单链表的结构定义试设计一个算法,通过遍历一趟链表,将链表中所有结点按逆序链接。
typedefstructnode{//链表结点
ElemTypedata;//结点数据域
structnode*link;//结点链域
}ListNode,*LinkList;
VoidTnerse(LinkList&first){
}
答案:
VoidTnerse(LinkList&first)
{
LinkList*p,*q;
/*链表为空,只有一个头结点,返回*/
if((p=first->link)==NULL)
return;
q=p->link;
first->link=NULL;
for(;q;p=q,q=q->link)
{
p->link=first->link;
first->link=p;
}
p->link=first->link;
first->link=p;
}
(3)设计一个算法,将数组A[n]中所有整数原地逆置,即利用原数组空间将数组中全部元素反转。
voidreverse(intA[],intn){}
答案:
voidreverse(inta[],intn)
{
inti;
for(i=0;i{
a[i]+=a[n-1-i];
a[n-1-i]=a[i]-a[n-1-i];
a[i]=a[i]-a[n-1-i];
}
}
(4)已知一个线性表中的元素按值非递减有序排列,以链式存储编写一个算法,删除表中多余
的值相同的元素。
voidDeleteEqual2(LinkekListL)
答案:
voidDeleteEqual2(LinkekListL)
{
p=L->next;q=p->next;
while(p->next)
{
if(p->data!
=q->data)/*若相邻两元素不相等时,p和q