数据结构与算法习题及答案Word文档格式.docx
《数据结构与算法习题及答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法习题及答案Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
elsex++;
(2)for(i=0;
i<
n;
i++)
for(j=0;
j<
m;
j++)
a[i][j]=0;
(3)s=0;
fori=0;
for(j=0;
s+=B[i][j];
sum=s;
(4)i=1;
while(i<
=n)
i=i*3;
(5)x=0;
for(i=1;
for(j=1;
=n-i;
x++;
(6)x=n;
108C63.5C1C-1C1Cext=s;
(*s).next=(*p).next;
C.s->
next=p->
next;
p->
next=s->
D.s->
next=s;
(14)在双向链表存储结构中,删除p所指的结点时须修改指针()。
A.p->
next->
prior=p->
prior;
prior->
B.p->
prior=p;
C.p->
next=p;
D.p->
(15)在双向循环链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是()。
next=q;
q->
prior=q;
C.q->
D.q->
2.算法设计题
(1)将两个递增的有序链表合并为一个递增的有序链表。
要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。
表中不允许有重复的数据。
voidMergeList_L(LinkList&
La,LinkList&
Lb,LinkList&
Lc){
pa=La->
pb=Lb->
Lc=pc=La;
3C想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
A.x=top->
data;
top=top->
link;
B.top=top->
link;
x=top->
C.x=top;
D.x=top->
(5)设有一个递归算法如下
intfact(intn){3C0C线性表的链式存储结构D.栈
(11)用链接方式存储的队列,在进行删除运算时( )。
A.仅修改头指针B.仅修改尾指针
C.头、尾指针都要修改D.头、尾指针可能都要修改
(12)循环队列存储在数组A[0..m]中,则入队时的操作为( )。
A.rear=rear+1B.rear=(rear+1)%(m-1)
C.rear=(rear+1)%mD.rear=(rear+1)%(m+1)
(13)最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( )。
A.(rear+1)%n==frontB.rear==front
C.rear+1==frontD.(rear-l)%n==front
(14)栈和队列的共同点是( )。
A.都是先进先出B.都是先进后出
C.只允许在端点处插入和删除元素D.没有共同点
(15)一个递归算法必须包括( )。
A.递归部分B.终止条件和递归部分
C.迭代部分D.终止条件和迭代部分
(2)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。
试写一个算法判定给定的字符向量是否为回文。
(提示:
将一半字符入栈)
根据提示,算法可设计为:
0’9’0’9’0’0’9’0’0’9’0’IOIIOIOOB.IOOIOIIOC.IIIOIOIOD.IIIOOIOO
通过对
的分析,写出一个算法,判定所给的操作序列是否合法。
若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。
A和D是合法序列,B和C是非法序列。
设被判定的操作序列已存入一维数组A中。
intJudge(charA[])
0’0’M-1]实现循环队列,其中M是队列长度。
设队头指针front和队尾指针rear,约定front指向队头元素的前一位置,rear指向队尾元素。
定义front=rear时为队空,(rear+1)%m=front为队满。
约定队头端入队向下标小的方向发展,队尾端入队向下标大的方向发展。
(1)#defineM队列可能达到的最大长度
typedefstruct
{elemtpdata[M];
intfront,rear;
}cycqueue;
(2)elemtpdelqueue(cycqueueQ)
C100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。
A.808B.818C.1010D.1020
(7)设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为()。
A.BA+141B.BA+180C.BA+222D.BA+225
(8)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。
A.13B.33C.18D.40
(9)若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i<
j)的位置k的关系为()。
A.i*(i-1)/2+jB.j*(j-1)/2+iC.i*(i+1)/2+jD.j*(j+1)/2+i
(10)A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。
A.i(i-1)/2+jB.j(j-1)/2+iC.i(j-i)/2+1D.j(i-1)/2+1
(11)设二维数组A[1..m,1..n](即m行n列)按行存储在数组B[1..m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为()。
A.(i-1)*n+jB.(i-1)*n+j-1C.i*(j-1)D.j*m+i-1
(12)数组A[0..4,-1..-3,5..7]中含有元素的个数()。
A.55B.45C.36D.16
(13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为()。
A.(g)B.(d)C.cD.d
(14)广义表((a,b,c,d))的表头是(),表尾是()。
A.aB.()C.(a,b,c,d)D.(b,c,d)
(15)设广义表L=((a,b,c)),则L的长度和深度分别为()。
A.1和1B.1和3C.1和2D.2和3
(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。
模式串t的next和nextval值如下:
j
123456789101112
t串
abcaabbabcab
next[j]
011122312345
nextval[j]
011021301105
(2)设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa”
计算模式p的naxtval函数值;
不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。
p的nextval函数值为0110132。
(p的next函数值为0111232)。
利用KMP(改进的nextval)算法,每趟匹配过程如下:
第一趟匹配:
abcaabbabcabaacbacba
abcab(i=5,j=5)
第二趟匹配:
abc(i=7,j=3)
第三趟匹配:
a(i=7,j=1)
第四趟匹配:
abcaabbabcabaacbacba
(成功)abcabaa(i=15,j=8)
(3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。
求:
存放该数组所需多少单元?
存放数组第4列所有元素至少需多少单元?
数组按行存放时,元素A[7,4]的起始地址是多少?
数组按列存放时,元素A[4,7]的起始地址是多少?
每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。
(1)242
(2)22(3)s+182(4)s+142
(4)请将香蕉banana用工具H()—Head(),T()—Tail()从L中取出。
L=(apple,(orange,(strawberry,(banana)),peach),pear)
H(H(T(H(T(H(T(L)))))))
(5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。
voidCount()
是字符串输入结束标志
{InvertStore(A);
A[i++]=ch;
0’0’0’m,1..n]含有m*n个整数。
写一个算法判断a中所有元素是否互不相同输出相关信息(yes/no);
试分析算法的时间复杂度。
[题目分析]判断二维数组中元素是否互不相同,只有逐个比较,找到一对相等的元素,就可结论为不是互不相同。
如何达到每个元素同其它元素比较一次且只一次?
在当前行,每个元素要同本行后面的元素比较一次(下面第一个循环控制变量p的for循环),然后同第i+1行及以后各行元素比较一次,这就是循环控制变量k和p的二层for循环。
intJudgEqual(inga[m][n],intm,n)
[算法讨论]对数组中元素各比较一次,比较次数为n。
最佳情况(已排好,正数在前,负数在后)不发生交换,最差情况(负数均在正数前面)发生n/2次交换。
用类c编写,数组界偶是0..n-1。
空间复杂度为O
(1).
第5章树和二叉树
1.选择题
(1)把一棵树转换为二叉树后,这棵二叉树的形态是()。
A.唯一的B.有多种
C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子
(2)由3个结点可以构造出多少种不同的二叉树(
)
A.2B.3C.4D.5
(3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250B.500C.254D.501
(4)一个具有1025个结点的二叉树的高h为()。
A.11B.10C.11至1025之间D.10至1024之间
(5)深度为h的满m叉树的第k层有()个结点。
(1=<
k=<
h)
A.mk-1B.mk-1C.mh-1D.mh-1
(6)利用二叉链表存储树,则根结点的右指针是()。
A.指向最左孩子B.指向最右孩子C.空D.非空
(7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()遍历实现编号。
A.先序B.中序C.后序D.从根开始按层次遍历
(8)若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。
A.前序B.中序C.后序D.按层次
(9)在下列存储形式中,()不是树的存储形式?
A.双亲表示法B.孩子链表表示法C.孩子兄弟表示法D.顺序存储表示法
(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。
A.所有的结点均无左孩子B.所有的结点均无右孩子
C.只有一个叶子结点D.是任意一棵二叉树
(11)某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。
A.空或只有一个结点B.任一结点无左子树
C.高度等于其结点数D.任一结点无右子树
(12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。
A.X的双亲B.X的右子树中最左的结点
C.X的左子树中最右结点D.X的左子树中最右叶结点
(13)引入二叉线索树的目的是()。
A.加快查找结点的前驱或后继的速度B.为了能在二叉树中方便的进行插入与删除
C.为了能方便的找到双亲D.使二叉树的遍历结果唯一
(14)线索二叉树是一种()结构。
A.逻辑B.逻辑和存储C.物理D.线性
(15)设F是一个森林,B是由F变换得的二叉树。
若F中有n个非终端结点,则B中右指针域为空的结点有()个。
A.n-1B.nC.n+1D.n+2
2.应用题
(1)试找出满足下列条件的二叉树
先序序列与后序序列相同
中序序列与后序序列相同
先序序列与中序序列相同
中序序列与层次遍历序列相同
先序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历“左子树—根—右子树”,后序遍历顺序是:
“左子树—右子树―根",根据以上原则,本题解答如下:
(1)若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树
(2)若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树.
(3)若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树.
(4)若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树
(2)设一棵二叉树的先序序列:
ABDFCEGH,中序序列:
BFDAGEHC
画出这棵二叉树。
画出这棵二叉树的后序线索树。
将这棵二叉树转换成对应的树(或森林)。
(1)
(2)
(3)假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为,,,,,,,。
试为这8个字母设计赫夫曼编码。
试设计另一种由二进制表示的等长编码方案。
对于上述实例,比较两种方案的优缺点。
解:
方案1;
哈夫曼编码
先将概率放大100倍,以方便构造哈夫曼树。
w={7,19,2,6,32,3,21,10},按哈夫曼规则:
【[(2,3),6],(7,10)】,……19,21,32
(100)
(40)(60)
192132(28)
(17)(11)
7106(5)
23
方案比较:
方案1的WPL=2+++4+++5+=++=
方案2的WPL=3+++++++=3
结论:
哈夫曼编码优于等长二进制编码
(4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。
初态:
weight
parent
lchild
rchild
1
3
2
12
7
4
5
6
8
11
9
10
13
15
20
27
47
终态
3.算法设计题
以二叉链表作为二叉树的存储结构,编写以下算法:
(1)统计二叉树的叶结点个数。
intLeafNodeCount(BiTreeT)
{
if(T==NULL)
return0;
c;
}1C1C8C队列C.树D.图
(9)用邻接表表示图进行深度优先遍历时,通常借助()来实现算法。
A.栈B.队列C.树D.图
(10)深度优先遍历类似于二叉树的()。
A.先序遍历B.中序遍历C.后序遍历D.层次遍历
(11)广度优先遍历类似于二叉树的()。
A.先序遍历B.中序遍历C.后序遍历D.层次遍历
(12)图的BFS生成树的树高比DFS生成树的树高()。
A.小B.相等C.小或相等D.大或相等
(13)已知图的邻接矩阵如图所示,则从顶点0出发按深度优先遍历的结果是()。
图邻接矩阵
(14)已知图的邻接表如图所示,则从顶点0出发按广度优先遍历的结果是(),按深度优先遍历的结果是()。
A.0132B.0231
C.0321D.0123
图邻接表
(15)下面()方法可以判断出一个有向图是否有环。
A.深度优先遍历B.拓扑排序C.求最短路径D.求关键路径
(1)已知如图所示的有向图,请给出:
每个顶点的入度和出度;
邻接矩阵;
邻接表;
逆邻接表。
(2)已知如图所示的无向网,请给出:
最小生成树
图无向网
a
→
b
c
d
e
^
h
f
g
4^
(3)已知图的邻接矩阵如所示。
试分别画出自顶点1出发进行遍历所得的深度优先生成树和广度优先生成树。
(4)有向网如图所示,试用迪杰斯特拉算法求出从顶点a到其他各顶点间的最短路径,完成表。
D
终点
i=1
i=2
i=3
i=4
i=5
i=6
(a,b)
(a,c)
(a,d)
(a,c,f,d)
∞
(a,c,e)
(a,c,f)
16
(a,c,f,g)
14
(a,c,f,d,g)
S
终点集
{a,c}
{a,c,f}
{a,c,f,e}
{a,c,f,e,d}
{a,c,f,e,d,g}
{a,c,f,e,d,g,b}
(5)试对图所示的AOE-网:
求这个工程最早可能在什么时间结束;
求每个活动的最早开始时间和最迟开始时间;
图