a[i][j]=0;
A.O(m2)B.O(m*n)C.O(n*n)D.O(log2n)
9.在双向循环链表中,在p指针所指的节点后插入q所指向的新节点,其修改指针的操作是()。
A.p->next=q;q->prior=p;p->next->prior=q;q->next=q;B.p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;C.q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;D.q->prior=p;q->next=p->next;p->next=q;p->next->prior=q;
10.设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是()。
A.head==NULLB.head->next==NULL
C.head->next==headD.head!
=NULL
11.判定一个队列Q(最多元素为m)为满队列的条件是()。
A.Q->rear-Q->front==mB.Q->rear-Q->front-1==m
C.Q->front==Q->rearD.Q->front==Q->rear+1
12.串的长度是指()。
A.串中所含不同字母的个数B.串中所含字符的个数
C.串中所含不同字符的个数D.串中所含非空格字符的个数
13.设有一个10阶的下三角矩阵A(包括对角线),按照从上到下、从左到右的顺序存储到连续的55个存储单元中,每个数组元素占1个字节的存储空间,则A[5][4]地址与A[0][0]的地址之差为()。
A.10B.19C.28D.55
14.在下述结论中,正确的是()。
①只有一个结点的二叉树的度为0;
②二叉树的度为2;
③二叉树的左右子树可任意交换;
④深度为K的完全二叉树结点个数小于或等于深度相同的满二叉树;
A.①②③B.②③④C.②④D.①④
15.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()。
A.9B.11C.15D.不确定
16.具有n个顶点的无向连通图的生成树应有()条边。
A.n-1B.nC.n+1D.n+2
17.设有向无环图G中的有向边集合E={<1,2>,<2,3>,<3,4>,<1,4>},则下列属于该有向图G的一种拓扑排序序列的是()。
A.1,2,3,4B.2,3,4,1
C.1,4,2,3D.1,2,4,3
18.对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为()。
A.(n-1)/2B.n/2C.(n+1)/2D.n
19.从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)一端的方法称为()。
A.归并排序B.冒泡排序
C.插入排序D.选择排序
20.若一组记录的排序码为(46,79,56,38,40,84),则利用快速排序方法,以第一个记录为基准得到的一次划分结果为()。
A.38,40,46,56,79,84B.40,38,46,79,56,84
C.40,38,46,56,79,84D.40,38,46,84,56,79
21.设某个栈的入栈序列是A,B,C,D,E,则下面4个选项中不可能的出栈序列是。
A.ADBECB.BCDEAC.EBCADD.EABCD
22.广义表(a,(b,c),d)的表头和表尾分别为。
A.a和(b,c),dB.(a)和(b,c),dC.a和((b,c),d)D.(a)和((b,c),d)
23.设有向图的顶点个数为n,则该图是有向完全图的条件是边的条数满足。
A.n(n-1)B.n(n-1)/2C.n(n+1)/2D.n(n+1)
24.一个有n个顶点的无向连通图的生成树,其边的条数为。
A.n-1B.nC.n+1D.nlogn
25.一个有向图用邻接矩阵表示,要删除所有从第i个顶点发出的边,应该。
A.将邻接矩阵的第i行删除B.将邻接矩阵的第i行元素全部置零
C.将邻接矩阵的第i列删除D.将邻接矩阵的第i列元素全部置零
26.已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则完全二叉树的结点个数最多是。
A.39 B.52 C.111 D.119
27.在线索化二叉树中,t所指结点没有左子树的充要条件是。
A.t->lchild==NULLB.t->ltag==1C.t->ltag==0D.以上都不对
28.AVL树是一种平衡的二叉排序树,树中任一结点的。
A.左、右子树高度差的绝对值不超过1
B.左、右子树的高度均相同
C.左子树的高度均大于右子树高度
D.左子树的高度均小于右子树高度
29.下列四个序列中,哪一个是堆。
A.75,65,30,15,25,45,20,10B.75,65,45,10,30,25,20,15
C.75,45,65,30,15,25,20,10D.75,45,65,10,25,30,20,15
30.下列排序在一趟结束后不一定能选出一个元素放在其最终位置上的是。
A.选择排序B.归并排序C.冒泡排序D.快速排序
31.一组记录的关键字为46,79,56,38,40,84,利用快速排序的方法,以第一个记录为基准得到的一次划分结果为。
A.38,40,46,56,79,84B.40,38,46,79,56,84
C.40,38,46,56,79,84D.40,38,46,84,56,79
32.下列叙述中,不符合m阶B树定义要求的是。
A.根节点最多有m棵子树 B.所有叶结点都在同一层上
C.各结点内关键字均升序或降序排列 D.叶结点之间通过指针链接
三、应用题
1.设某棵二叉树的先序遍历序列为ABDFCEGH,中序遍历序列为BFDAGEHC,要求画出此二叉树并给出该二叉树的后序遍历序列。
2.设有无向连通网络G如下图所示
(1)画出其邻接矩阵存储;
(2)从顶点①搜索所得的深度优先搜索(DFS)序列和广度优先搜索(BFS)序列;
(3)请采用普里姆或克鲁斯卡尔算法画出G的最小生成树。
3.已知世界六大城市为:
北京(Pe)、纽约(N)、巴黎(Pa)、伦敦(L)、东京(T)、墨西哥(M),下表给定了这六大城市之间的交通里程:
世界六大城市交通里程表(单位:
百公里)
pe
n
pa
L
T
M
Pe
109
82
81
21
124
N
109
58
55
108
32
PA
82
58
3
97
92
L
81
55
3
95
89
T
21
108
97
95
113
M
124
32
92
89
113
(1).画出这六大城市的交通网络图;
(2).画出该图的邻接表表示法;
(3).画出该图按权值递增的顺序来构造的最小(代价)生成树.
4.已知某系统在通信联络中只可能出现4种字符:
a,b,c,d,其概率分别为1,3,5,7。
要求:
(1)画出对应的哈夫曼树(要求左子树根结点的权小于等于右子树根结点的权)。
(2)为这4个字符设计哈夫曼编码(要求左分支为0,右分支为1)。
(3)计算该哈夫曼树的最小加权路径长度WPL。
5.已知某系统在通信联络中只可能出现8种字符a,b,c,d,e,f,g,h,其概率分别为5,25,3,6,10,11,36,4。
要求:
(1)画出对应的哈夫曼树(要求左子树根结点的权值小于等于右子树根结点的权值)。
(2)为8个字符设计哈夫曼编码(规定左子树编码为0,右子树编码为1)。
(3)计算该哈夫曼树的最小加权路径长度WPL。
6.已知一个二叉树的顺序存储结构图如下:
(1)请画出该二叉树;
(2)写出该二叉树先序、中序遍历序列;
(3)将其转化成等价的树或森林。
下标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结点
A
B
C
D
E
F
G
H
I
J
7.已知一有向网的邻接矩阵如下,如需在其中一个结点建立娱乐中心,要求该结点距其它各结点的最长往返路程最短,相同条件下总的往返路程越短越好,问娱乐中心应选址何处?
给出解题过程。
8.AOE网可用来估算工程的完成时间,图3是某项工程AOE网的邻接表表示(V1地址为1),其中表结点第一个域为顶点,第二个域为权值。
顶点Vi表示事件,数字i表示事件的编号,边的数字(权值)表示活动所需的天数,求:
(1)分别画出此项工程对应的邻接矩阵和AOE网。
(2)以顶点V1出发广度遍历图G(邻接表表示)所得的顶点序列。
(3)给出图G的一个拓扑排序序列。
(4)计算此项工程各事件(顶点)的ve(vi)和vl(vi)的函数值,各活动弧的e(ai)和l(ai)的函数值,即各事件和各活动弧的最早开始时间和最迟开始时间?
(5)根据计算结果确定此工程的关键路径及完成此工程的工期(即所需的最少天数)?
9.给定一组关键字序列(SUN,MON,TUE,WED,THU,FRI,SAT),建立一个长度为10的哈希表,哈希函数为H(K)=(K中第一个字母在字母表中的序号)%7。
要求:
,并计算:
对以下
(1)分别用线性探测和链地址两种方法处理冲突,画出所对应构造的哈希表(散列表)。
(2)设每个记录的查找概率相等,分析并计算在以上两种处理冲突方法所构造的哈希表中进行查找时,查找成功的平均查找长度(ASLsucc)以及查找不成功的平均查找长度(ASLunsucc)。
10.将关键字序列(7,8,30,11,18,9,14),散列存储到散列表中,散列表的存储空间是一个下标从0开始的一个一维数组,散列函数为H(Key)=(Key×3)%P。
处理冲突采用线性探测再散列法,已知装填因子为0.7。
要求:
(1)画出所构造的散列表(哈希表)。
(2)分别计算等概率情况下,查找成功和查找不成功的平均查找长度。
四、算法分析与设计题
1.下面程序段的功能实现数据x进栈,要求在下划线处填上正确的语句。
typedefstruct{ints[100];inttop;}sqstack;
voidpush(sqstack&stack,intx)
{
if(stack.top==m-1)printf(“overflow”);
else{____________________;
_________________;}
}
2.二叉搜索树的查找——递归算法:
boolFind(BTreeNode*BST,ElemType&item)
{
if(BST==NULL)
returnfalse;//查找失败
else{if(item==BST->data){
item=BST->data;//查找成功
return___________;}
elseif(itemdata)
returnFind(______________,item);
elsereturnFind(_______________,item);
}//if
}
3.下面程序段的功能是实现二分查找算法,请在下划线处填上正确的语句。
structrecord{intkey;intothers;};
intbisearch(structrecordr[],intk)
{intlow=0,mid,high=n-1;
while(low<=high)
{
________________________________;
if(r[mid].key==k)return(mid+1);
elseif(____________)high=mid-1;
elselow=mid+1;}
return(0);}
4.下面是一趟快速排序的算法,待排序记录存放在记录数组r中,请在横线上填空,把算法补充完整。
intQKPass(RecordTyper[],intlow,inthigh)
{x=r[low];/*选择基准记录*/
while(low{while(low=x.key)
high--;
if(lowwhile(lowlow++;
if(low}
r[low]=x;/*将基准记录保存到low=high的位置*/
returnlow;/*返回基准记录的位置*/
}/*QKPass*/
5.
(1)将两个非递减的有序链表合并为一个非递增的有序链表。
要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。
表中允许有重复的数据。
(2)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A的元素类型为整型,要求B、C表利用A表的结点)。
(3)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O
(1)的算法,该算法删除线性表中所有值为item的数据元素。
6.设计判断两个二叉树是否相同的算法。
data
next
7.已知带有表头结点的单链表,结点结构为:
假设该链表只给出了头指针list。
在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。
若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。
要求:
(1)描述算法的基本设计思想。
(2)根据设计思想,采用C程序设计语言描述算法,关键之处请给出简要注释。
8.利用二叉树递归遍历算法,编写统计二叉树中叶子结点数目的算法。
二叉树采用二叉链表存储的类型定义如下:
typedefchardatatype;
typedefstructNode
{datatypedata;
structNode*lchild,*rchild;
}BiTree;
9.设二叉排序树按照二叉链表存储,编写算法InsertBST(BSTree*&bst,KeyTypek)在二叉排序树中插入一个结点。
二叉排序树的链式存储结构的类型定义如下:
typedefintKeyType;
typedefstructNode
{KeyTypekey;
structNode*lchild,*rchild;
}BSTree;