a[i][j]=i*j;
A.O(m2)B.O(n2)C.O(m*n)D.O(m+n)
·9.下面算法的时间复杂度为()。
!
intf(unsignedintn){
if(n==0||n==1)return1;
elsereturnn*f(n-1);}
A.O
(1)B.O(n)C.O(n2)D.O(n!
)
10.设单链表中结点的结构为(data,link)。
已知指针q所指结点是指针p所指结点的直接前驱,若在*q与*p之间插入结点*s,则应执行下列哪一个操作()。
!
A.s->link=p->link;p->link=s;B.q->link=s;s->link=p;
C.p->link=s->link;s->link=q;D.p->link=s;s->link=q;
11.设单链表中结点的结构为(data,link)。
若想摘除结点*p的直接后继,则应执行下列哪一个操作()。
!
A.p->link=p->link->link;B.p=p->link;p->link=p->link->link
C.p->link=p->link;D.p=p->link->link;
12.栈的插入和删除操作在()进行。
!
A.栈顶B.栈底C.任意位置D.指定位置
13.若让元素1,2,3依次进栈,则出栈次序不可能出现哪种情况()。
!
A.3,2,1B.2,1,3C.3,1,2D.1,3,2
#14.广义表A(a),则表尾为()。
A.aB.(())C.空表D.(a)
#15.下列广义表是线性表的有()。
A.E(a,(b,c))B.E(a,E)C.E(a,b)D.E(a,L())
16.折半搜索与二叉搜索树(即二叉排序树)的时间性能()。
A.相同B.完全不同C.有时不相同D.不确定
17.采用折半搜索算法搜索长度为n的有序表时,元素的平均搜索长度为()。
!
A.O(nlog2n)B.O(n)C.O(log2n)D.O(n)
18.采用邻接表存储的图的深度优先遍历算法类似于二叉树的()。
!
A.中序遍历B.前序遍历C.后序遍历D.按层次遍历
19.每次从无序表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做()排序。
!
A.插入B.选择C.交换D.外排序
20.采用邻接表存储的图的广度优先遍历算法类似于二叉树的()。
A.中序遍历B.前序遍历C.后序遍历D.按层次遍历
二.填空题
1.算法是一个有穷的指令集,它为解决某一特定任务规定了一个运算序列。
它应具有输入、输出、___确定性________、有穷性和可执行性等特性。
!
·2.在一棵度为3的树中,度为2的结点个数是1,度为0的结点个数是6,则度为3的结点个数是_______2____。
!
3.队列的插入操作在______队尾_____进行,删除操作在____队头_______进行。
4.当用长度为n的数组顺序存储一个栈时,若用top==n表示栈空,则表示栈满的条件为_____top==0______。
!
5.对序列(49,38,65,97,76,27,13,50)采用快速排序法进行排序,以序列的第一个元素为基准元素得到的划分结果是___[132738]45[50657697]_______________。
!
6.对于一棵具有n个结点的树,该树中所有结点的度数之和为___n-1__________。
7.在一个堆的顺序存储中,若一个结点的下标为i,则它的左子女结点的下标为______2i+1____,右子女结点的下标为___2i+2_______。
·8.请指出在顺序表{2、5、7、10、14、15、18、23、35、41、52}中,用折半查找关键码12需做_____4_________次关键码比较。
!
9.若线性表采用顺序存储结构,每个元素占用4个存储单元,第一个元素的存储地址为100,则第12个元素的存储地址是_____144_____________。
10.在一个长度为n的顺序表中,向第i个元素(1≤i≤n+1)之前插入一个新元素时,需要向后移动_____n-i+1_______个元素。
?
11.设有两个串p和q,求q在p中首次出现的位置的运算称作____求子串_______。
·12.以折半搜索方法搜索一个线性表时,此线性表必须是___顺序________存储的__有序_________表。
·13.在一个无向图中,所有顶点的度数之和等于所有边数的____2_______倍。
14.判定一个循环队列QU(最多元素为m)为满队列的条件是__QU->front==(QU->rear+1)%m____。
___________。
#15.设有广义表【不要求广义表】D(a,b,D),其长度为___3________,深度为___________。
16.在一个具有n个顶点的无向完全图中,要连通所有顶点则至少需要___n-1____条边,在一个具有n个顶点的有向完全图中,包含有_n(n-1)____条边。
17.对于一个具有n个顶点的图,若采用邻接矩阵表示,则矩阵大小为____n*n_______。
18.对于一个具有n个顶点和e条边的连通图,其生成树中顶点数和边数分别为____n_______和____n-1_______。
19.在直接选择排序中,记录比较次数的时间复杂度为___O(n*n)________,记录移动次数的时间复杂度为_____O(n)______。
20.快速排序在平均情况下的空间复杂度为___O(logn)________,在最坏情况下的空间复杂度为________O(n)___。
21.当问题的规模n趋向无穷大时,算法执行时间T(n)的数量级被称为算法的____时间复杂度_______。
25.在一个无向图的邻接表中,若表结点的个数是m,则图中边的条数是___m/2_________条。
26.对于一个具有n个顶点的图,若采用邻接矩阵表示,则矩阵大小为_______n的平方____。
三、判断题
(y)1.直接选择排序是一种不稳定的排序方法。
(n)2.折半搜索只适用于有序表,包括有序的顺序表和有序的链表。
(y)3.数据的逻辑结构与数据元素本身的内容和形式无关。
(n)4.数据结构是指相互之间存在一种或多种关系的数据元素的全体。
(n)5.线性表的逻辑顺序与物理顺序总是一致的。
(y)6.线性表若采用链式存储表示时所有存储单元的地址可连续可不连续。
(y)7.二叉树是数的特殊情形。
(y)8.若有一个叶子结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点。
(n)9.若有一个叶子结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点。
(n)10.任一棵二叉搜索树的平均搜索时间都小于用顺序搜索法搜索同样结点的顺序表的平均搜索时间。
(n)11.对于同一组待输入的关键码集合,虽然各关键码的输入次序不同,但得到的二叉搜索树都是相同的。
(y)12.最优二叉搜索树的任何子树都是最优二叉搜索树。
(y)13.在二叉搜索树上插入新结点时,不必移动其它结点,仅需改动某个结点的指针,使它由空变为非空即可。
(y)14.有n(n≥1)个顶点的有向强连通图最少有n条边。
(n)15.连通分量是无向图中的极小连通子图。
(n)16.二叉树中任何一个结点的度都是2。
(n)17.单链表从任何一个结点出发,都能访问到所有结点。
四、程序阅读填空
1.在顺序表中第i个位置插入新元素x!
templateintSeqList:
:
Insert(Type&x,inti){
if(i<0||i>last+1||last==MaxSize-1)return0;//插入不成功
else{
last++;
for(intj=last;j>i;j--)
data[j]=data[j-1];
data[i]=x;
return1;//插入成功
}
}
2.删去链表中除表头结点外的所有其他结点
templatevoidList:
:
MakeEmpty(){
ListNode*q;
while(first→link!
=NULL){
q=firstlink;
firstlink=qlink;
//将表头结点后第一个结点从链中摘下
deleteq;//释放它
}
last=first;//修改表尾指针
}
3.删去链式队头结点(队头指针为QueueNode*front),并返回队头元素的值
templateTypeQueue:
:
DeQueue(){
assert(!
IsEmpty());//判队空的断言
QueueNode*p=______front____________________;
Typeretvalue=p→data;//保存队头的值
__front=frontlink__;//新队头
deletep;
returnretvalue;
}
#4.最小堆的向下调整算法(没有)
templatevoidMinHeap:
:
FilterDown(intstart,intEndOfHeap){
inti=start,j=2*i+1;//j是i的左子女
Typetemp=heap[i];
while(j<=EndOfHeap){
if(j
heap[j+1].key)j++;//两子女中选小者
if(temp.key<=heap[j].key)break;
else{heap[i]=heap[j];i=j;j=2*j+1____;}
}
__heap[i]=temp;____;
}
5.基于有序顺序表的折半搜索递归算法(Element为有序顺序表)!
templateintorderedList:
:
BinarySearch(constType&x,constintlow,constinthigh)const
{
intmid=-1;
if(low<=high){
____mid=(low+high)/2______;
if(Element[mid].getKey()
mid=BinarySearch(__x,mid+1,high_____);
elseif(Element[mid].getKey()>x)
mid=BinarySearch(x,low,mid-1);
}
returnmid;
}
6.直接插入排序的算法(按关键码Key非递减顺序对数据表list进行排序)(无)
templatevoidInsertionSort(datalist&list){
for(inti=1;i}
templateviodInsert(datalist&list,inti){
Elementtemp=list.Vector[i];
intj=i;//从后向前顺序比较
while(j>0&&temp.getKey()______list.vector[j]=list.vector[j-1]______;
j--;
}
list.Vector[j]=temp;
}
7.直接选择排序的算法:
(没)
templatevoidSelectSort(datalist&list){
for(inti=0;i}
templateviodSelectExchange(datalist&list,constinti){
intk=i;
for(intj=i+1;jif(list.Vector[j].getKey()____k=j_______;//当前具有最小关键码的对象
if(k!
=i)Swap(list.Vector[i],list.Vector[k]);//交换
}
#8.判断一个带表头结点的双向循环链表L是否对称相等的算法如下所示:
(无)
intsymmetry(DblListDL){
intsym=1;
DblNode*p=DL->rLink,*q=DL->lLink;
While(p!
=q&&p->rLink!
=q&&sym==1)
if(p->data==q->data){
____p=prLink_____;
_______q=qlLink_________________;
}
elsesym=0;
returnsym;
}
五、简答题
1.给定权值集合{15,03,14,02,06,09,16,17},构造相应的霍夫曼树,并计算它的带权外部路径长度。
!
(Ⅰ)
05
17
16
09
06
14
15
F:
17
16
09
06
02
14
15
02
03
03
(Ⅱ)
17
16
09
14
15
20
16
14
15
(Ⅲ)
17
11
09
11
06
05
02
03
06
05
(Ⅴ)
33
20
29
02
03
29
16
17
20
(Ⅳ)
16
17
11
09
15
14
14
11
09
15
05
06
06
05
02
03
02
03
(Ⅰ)
05
17
16
09
06
14
15
F:
17
16
09
06
02
14
15
02
03
03
(Ⅱ)
17
16
09
14
15
20
16
14
15
(Ⅲ)
17
11
09
11
06
05
02
03
06
05
(Ⅴ)
33
20
29
02
03
29
16
17
20
(Ⅳ)
16
17
11
09
15
14
14
11
09
15
05
06
06
05
02
03
02
03
82
(Ⅶ)
49
33
(Ⅵ)
49
33
17
29
20
16
17
16
29
20
14
11
09
15
11
09
15
14
06
05
06
05
03
02
03
02
此树的带权路径长度WPL=229。
2.线性表可用顺序表或是链表存储,此两种存储表示各有哪些特点,优缺点?
!
P50
3.设有一个输入数据的序列是{46,25,78,62,12,37,70,29},试画出从空树起,逐个输入各个数据而生成的二叉搜索树。
按顺序逐个输入
46
/\
2578
/\/
123762
/\
2970
4.对于如右图所示的有向图,试写出:
!
(1)从顶点①出发进行深度优先搜索所得到的深度优先生成树;
(2)从顶点②出发进行广度优先搜索所得到的广度优先生成树;
P178
#5.用广义表的带表头结点的存储表示法表示下列集合。
A=()
B=(6,2)
C=(‘a’,(5,3,‘x’))
D=(B,C,A)
E=(B,D)
6.右图所示为一有向图,请给出该图的下述要求:
(1)给出每个顶点的入度和出度;
130
222
312
431
521
614
(2)以结点3为起始结点,分别画出该图的一个深度优先生成树和一个宽度优先生成树;
(3)给出该图的邻接矩阵;
(4)给出该图的邻接表;
(5)给出该图的逆邻接表;
7.已知二叉树的先序、中序和后序序列分别如下,但其中有一些已模糊不清,试构造出该二叉树。
先序序列 _BC_EF__
中序序列 BDE_AG_H
后序序列 e_DCb_GHf_A
8.已某个不带权的无向图采用邻接矩阵存储方法依次将顶点的数据信息存放于一维数组ABCDEFGH中,边的信息存放于邻接矩阵中,邻接矩阵为
01100000
10001011
10010100
00100100
01000001
00110000
01000000
01001000
请写出从顶点A出发对该图进行深度优先遍历后得到的顶点序列。
六、算法编程
1.已知A[n]为整数数组,试写出实现下列运算的递归算法:
!
!
!
!
(1)求数组A中的最大整数。
(2)求n个整数的和。
(3)求n个整数的平均值。
•intMAX(int[]array,intmax,intindex)//求最大的递归
{
if(index>array.length)
returnmax;
elseif(array[index]>max)
returnMAX(array,array[index],index+1);
else
returnMAX(array,max,index+1);
}
•intSUM(int[]array,intsum,intindex){ //求和递归
if(index>array.length)returnsum;
else
returnSUM(array,sum+=array[index],index+1);
}
•floatAVE(intarray[],floatsum,intindex){ //求平均值递归
if(index>array.length)returnsum/(index-1);
else
returnAVE(array,sum+=array[index],index+1);
}
2.请给出二叉树及其结点的类定义,并实现一个计算二叉树结点个数的成员函数
(无)