数据结构第3次.docx
《数据结构第3次.docx》由会员分享,可在线阅读,更多相关《数据结构第3次.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构第3次.docx](https://file1.bdocx.com/fileroot1/2023-1/2/953c2531-0783-4fab-9d57-a450a71cb984/953c2531-0783-4fab-9d57-a450a71cb9841.gif)
数据结构第3次
第3次作业
一、填空题(本大题共30分,共10小题,每小题3分)
1.
栈是一种特殊的线性表,允许插入和删除运算的一端称为______。
不允许插入和删除运算的一端称为______。
2.
二叉树由,,三个基本单元组成。
3.
构造连通网最小生成树的两个典型算法是______。
4.
在一个稀疏矩阵中,每个非零元素所对应的三元组包括该元素的________、________和________三项。
5.
直接插入排序用监视哨的作用是_______。
6.
AOV网中,结点表示______,边表示______。
AOE网中,结点表示______,边表示______。
7.
已知指针p指向单链表L中的某结点,则删除其后继结点的语句是________。
8.
一棵深度为6的满二叉树有______个分支结点和______个叶子。
9.
已知二叉树前序为ABDEGCF,中序为DBGEACF,则后序一定是。
10.
在哈希文件中,处理冲突的方法通常有______、______、______和______四种。
二、算法设计题(本大题共20分,共2小题,每小题10分)
1.
编写一个算法将一个头结点指针为pa的单链表A分解成两个单链表A和B,其头结点指针分别为pa和pb,使得A链表中含有原链表A中序号为奇数的元素,而链表B中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
2.
设稀疏矩阵Mmxn中有t个非零元素,用三元组顺序表的方式存储。
请设计一个算法,计算矩阵M的转置矩阵N,要求转置算法的时间复杂度为O(n+t)。
三、简答题(本大题共20分,共4小题,每小题5分)
1.
假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}.
(1)为这8个字母设计哈夫曼编码。
(2)若用这三位二进制数(0…7)对这8个字母进行等长编码,则哈夫曼编码的平均码长是等长编码的百分之几?
它使电文总长平均压缩多少?
2.
若二叉树中各结点的值均不相同,则由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。
(1)已知一棵二叉树的前序序列和中序序列分别为ABDGHCEFI和GDHBAECIF,请画出此二叉树。
(2)已知一棵二叉树的在序序列和后序序列分别为BDCEAFHG和DECBHGFA,请画出此二叉树。
(3)已知一棵二叉树的前序序列和后序序列分别为AB和BA,请画出这两棵不同的二叉树。
3. 试举一个数据结构的例子、叙述其逻辑结构、存储结构、运算三个方面的内容。
4.
给定集合{15,3,14,2,6,9,16,17}
(1)(3分)用□表示外部结点,用○表示内部结点,构造相应的huffman树:
(2)(2分)计算它的带权路径长度:
(3)(2分)写出它的huffman编码:
(4)(3分)huffman编码常用来译码,请用语言叙述写出其译码的过程。
四、程序设计题(本大题共30分,共2小题,每小题15分)
1.
以二叉链表为存储结构,写出求二叉树叶子总数的算法
2.
设线性表的n个结点定义为(a0,a1,...an-1),重写顺序表上实现的插入算法:
InsertList
答案:
一、填空题(30分,共10题,每小题3分)
1.
参考答案:
栈顶,栈底
解题方案:
评分标准:
2.
参考答案:
根结点,左子树,右子树
解题方案:
评分标准:
3.
参考答案:
普里姆(prim)算法和克鲁斯卡尔(Kruskal)算法
解题方案:
评分标准:
4.
参考答案:
行号、列号、元素值
解题方案:
评分标准:
5.
参考答案:
免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。
解题方案:
评分标准:
6.
参考答案:
(1)活动
(2)活动间的优先关系(3)事件(4)活动边上的权代表活动持续时间
解题方案:
评分标准:
7.
参考答案:
q=p->next;p->next=q->next;free(q);
解题方案:
评分标准:
8.
参考答案:
n1+n2=0+n2=n0-1=31,26-1=32
解题方案:
评分标准:
9.
参考答案:
DGEBFCA
解题方案:
评分标准:
10.
参考答案:
开放地址法、再哈希法、链地址法、建立一个公共溢出区
解题方案:
评分标准:
二、算法设计题(20分,共2题,每小题10分)
1.
参考答案:
将单链表A中的所有偶数序号的结点删除,并在删除时把这些结点链接起来构成单链表B。
算法如下:
#include
#include
typedefintElemType;
typedefstructLNode
{
ElemTypedata;//数据域
structLNode*next;//指针域
}LNode,*LinkList;
voiddivide(LinkList&pa,LinkList&pb)
{pb=(LNode*)malloc(sizeof(LNode*));
pb->next=NULL;
r=pb;
p=pa->next;
while(p!
=NULL&&p->next!
=NULL)
{
q=p->next;
if(q!
=NULL)
{
p->next=q->next;
r->next=q;
r=q;
p=p->next;
}
}
r->next=NULL;
}
解题方案:
评分标准:
2.
参考答案:
转置可按转置矩阵的三元组表中的元素顺序进行,即按稀疏矩阵的列序。
这种方法时间复杂度是O(n*t),当t和m*n同量级时,时间复杂度为O(n3)。
另一种转置方法称作快速转置,使时间复杂度降为O(m*n)。
需要求出每列非零元素个数和每列第一个非零元素在转置矩阵三元组表中的位置,因此设置了两个附加向量。
下面分别给出两个算法。
TSMatrixTransMatrix(TSMatrixM,TSMatrixN)
{∥采用三元组表方式存储,按列序实现矩阵的转置
N.m=M.n;N.n=M.m;N.len=M.len;∥行数、列数和非零元素个数
if(N.len){q=l;∥设置N中第一个非零元素从下标1开始存储
for(j=1;j<=M.n;j++)∥按列,共M.n列
for(p=1;p<=M.len;++p)∥在M.len个元素中查找
if(M.data[p].col==j)∥转置
{N.data[q].row=M.data[p].col;
N.data[q].col=M.data[p].row;
N.data[q].e=M.data[p].e;q++;
}
}
returnN;
}∥TransMatrix
TSMatrixFastTransMatrix(TSMatrixM,TSMatrixN)
{∥三元组表上实现矩阵的快速转置的算法
N.m=M.n;N.n=M.m;N.len=M.len;
if(M.len)
{for(j=1;j<=M.n;j++)numb[j]=0;∥矩阵M每一列非零元初始化为零
for(t=1;t<=M.len;t++)numb[M.data[t].col]++;∥求矩阵M每一列得非零元个数
pos[1]=1;∥第1列第一个非零元在转置后的三元组中下标是1
for(j=2;j<=M.n;j++)∥求M.data第j列第一个非零元在N.data中的序号
pos[col]=pos[col-1]+num[col-1];
for(p=1;p<=M.len;p++)∥求转置矩阵N的三元组表
{j=M.data[p].col;q=pos[j];
N.data[q].row=M.data[p].col;N.data[q].col=M.data[p].row;
N.data[q].e=M.data[p].e;pos[j]++;∥同列下一非零元素位置
}
}
returnN;
}
解题方案:
评分标准:
三、简答题(20分,共4题,每小题5分)
1.
参考答案:
(1)哈夫曼编码
[P_47E42CBBE4BEF0B3804EEA501687A04A]
根据上图可得编码表:
a:
1001
b:
01
c:
10111
d:
1010
e:
11
f:
10110
g:
00
h:
1000
(2)用三位二进行数进行的等长编码平均长度为3,而根据哈夫曼树编码的平均码长为:
4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61
2.61/3=0.87=87%其平均码长是等长码的87%,所以平均压缩率为13%。
解题方案:
评分标准:
2.
参考答案:
(1)已知二叉树的前序序列为ABDGHCEFI和中序序列GDHBAECIF,则可以根据前序序列找到根结点为A,由此,通过中序序列可知它的两棵子树包分别含有GDHB和ECIF结点,又由前序序列可知B和C分别为两棵子树的根结点...以此类推可画出所有结点:
○A
/\
○B○C
//\
○D○E○F
/\/
○G○H○I
(2)以同样的方法可画出该二叉树:
○A
/\
○B○F
\\
○C○G
/\\
○D○E○H
(3)这两棵不同的二叉树为:
○A○A
/\
○B○B
解题方案:
评分标准:
3.
参考答案:
例如有一张学生体检情况登记表,记录了一个班的学生的身高、体重等各项体检信息。
这张登记表中,每个学生的各项体检信息排在一行上。
这个表就是一个数据结构。
每个记录(有姓名,学号,身高和体重等字段)就是一个结点,对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继(它的前面和后面均有且只有一个记录)。
这几个关系就确定了这个表的逻辑结构是线性结构。
这个表中的数据如何存储到计算机里,并且如何表示数据元素之间的关系呢?
即用一片连续的内存单元来存放这些记录(如用数组表示)还是随机存放各结点数据再用指针进行链接呢?
这就是存储结构的问题。
在这个表的某种存储结构基础上,可实现对这张表中的记录进行查询,修改,删除等操作。
对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算问题了。
解题方案:
评分标准:
4.
参考答案:
(1)
[P_F438585CD9EAD09DED967D20E23446F3]
(2)wpl=(2+3)*5+6*4+(9+14+15)*3+(16+17)*2=229
(3)编码为:
15:
111,3:
10101,14:
110,2:
10100,6:
1011,9:
100,16:
00,17:
01
(4)常用哈夫曼树为通讯用的字符编码,本题中集合的数值解释为字符发生的频率(次数)。
由哈夫曼树构造出哈夫曼编码。
译码时,进行编码的“匹配”,即从左往右扫描对方发来的“编码串”,用字符编码去匹配,得到原来的元素(本题中的数)。
解题方案:
评分标准:
四、程序设计题(30分,共2题,每小题15分)
1.
参考答案:
typedefcharDataType;//定义DataType类型
typedefstructnode
{
DataTypedata;
structnode*lchild,*rchild;//左右孩子子树
}BinTNode;//结点类型
typedefBinTNode*BinTree;//二叉树类型
intLeaf(BinTreeT)
{//算叶子数
if(T)
if(T->lchild==NULL)&&(T->rchild==NULL)
return1;
else
returnLeaf(T->lchild)+Node(T->rchild);
else
return0;
}
解题方案:
评分标准:
2.
参考答案:
#defineListSize100//假定表空间大小为100
typedefintDataType;//假定DataType的类型为int型
typedefstruct{
DataTypedata[ListSize];//向量data用于存放表结点
intlength;//当前的表长度
}Seqlist;
//以上为定义表结构
voidInsertList(Seqlist*L,Datatypex,inti)
{
//将新结点x插入L所指的顺序表的第i个结点ai的位置上,即插入的合法位置为:
0<=i<=L->length
intj;
if(i<0||i>L->length)
Error("positionerror");//非法位置,退出,该函数定义见教材P7.
if(L->length>=ListSize)
Error(“overflow");
for(j=L->length-1;j>=i;j--)
L->data[j+1]=L->data[j];
L->data[i]=x;
L->length++;
}
解题方案:
评分标准: