数据结构复习题(各章综合)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总共有480个元素
6已知一棵二叉树的中序序列和后序序列分别为DGBAECHF和GDBEHFCA,画出该二叉树,并写出其先序序列。
答案:ABDGCEFH
A
BC
D EF
GH
7设给定权集w={5,25,3,6,10,4},试构造关于w的一棵哈夫蔓树,并求其加权路径长度WPL。
答案:
wpl=(3+4)*4+(5+6)*3+10*3+25=116
ElemTypex;
while(a[i]){
switch(a[i])
{Βιβλιοθήκη Baidu
case '(':
Push(s,a[i]);
break;
case '[':
Push(s,a[i]);
break;
case ')':
GetTop(s,x);
if(x=='(')Pop(s,x);
else return FALSE;
break;
Cur82345670910110
序号0的存储单元为空闲链头结点,序号1的存储单元为工作链头结点;请分别画出删除e后的链表图和添加a后链表图(都是在该图的基础上进行)。
解:
删除e后的链表图:
序号01234567891011
DatacbgfD
Cur42358670910110
添加a后链表图:
序号01234567891011
(3)若查找关键字60,需要依次与哪些关键字比较?
(4)假定每个关键字的查找概率相等,求查找成功时的平均查找长度。
查找关键字63时,依次与关键字31、31、17、46、47进行了比较。
查找关键字60时,与12号地址比较,因12号地址没有数据,可知查找失败。
查找成功时的平均查找长度ASL=(6×1+1×2+3×5+1×6)/11=29/11
(1)冒泡排序(H,C,Q,P,A,M,S,R,D,F,X,Y)
(2)初始步长为4的希尔排序(P,A,C,S,Q,D,F,X,R,H,M,Y)
(3)快速排序(F,H,C,D,P,A,M,Q,R,S,Y,X)
初始建堆:(Y,S,X,R,P,C,M,H,Q,D,F,A)
(2)V1V2V3V4V5V6
(3)(4)见教材。
13、已知AOE网中顶点分别表示7个事件,有向线段分别表示10个活动,线段旁的数值表示每个活动花费的天数,如下图所示。请用顶点序列表示出关键路径,给出关键活动。
解:
事件v1v2v3v4v5v6v7
最早发生时间03267510
最晚发生时间03367610
医院建在村庄3时,各村庄往返总的交通代价为4+8+12+3+4+17+12+22=82;
医院建在村庄4时,各村庄往返总的交通代价为18+5+34+22+7+20+6+3=115。
显然,把医院建在村庄3时总体交通代价最少。
16.给出数据序列:52、33、74、25、18、36、29,请构造一棵AVL树。(不要求给出详细构造过程,只给出最后结果即可)。
表中黄色代表1次比较,红色代表2次比较,绿色代表5次比较,灰色代表6次比较。
18.有数据序列:47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89,10,哈希函数为:Hash(key)=key mod 18,用链地址法处理冲突,请构造哈希表并求出在等概率查找时查找成功的平均查找长度。
8画出以下二叉树对应的森林
答案:
9求具有12个结点的完全二叉树度为2,为1和为0的结点个数。
答案:
n0=6
n2=5
n1 =1
10.写出计算二叉树叶子节点个数的递归算法
答案:
intcountLeaf(BiTreeT )
{
if(!T)
return 0;
else if(!T->lchild&& !T->rchild)
typedefstruct
{
ELemType*base; //数组元素基址
intdim; //数组维数
int*bound; //数组各维长度信息保存区基址
int*constants; //数组映像函数常量的基址
}Array;
解:
dim=6
数组元素序号012345
Bound所指数组的值534222
constants所指数组的值96328421
return 1;
else
return(countLeaf(T->lchild) +countLear(T->rchild));
}
11.已知某图的邻接表为
(1).写出此邻接表对应的邻接矩阵;
(2).写出由v1开始的深度优先遍历的序列;
(3).写出由v1开始的深度优先的生成树;
(4).写出由v1开始的广度优先遍历的序列;
(5).写出由v1开始的广度优先的生成树;
解:略。
12、下图为一个连通网。
(1)画出该网的邻接矩阵表示。
(2)写出从v1出发对该网的广度优先搜索序列。
(3)从v1开始,给出用Prim算法构造该网的最小生成树的过程。
(4)给出用Kruskal算法构造该网的最小生成树的过程。
解:(1)该图的邻接矩阵表示如右图:
1编写算法求出带头结点的单链表的长度;
解:
intListLength_L(LinkList&L)
{
inti=0;
LinkListp=L;
if(p) p=p-next;
while(p){
p=p->next;
i++;
}
returni;
}
2假设静态链表的结构如下图:
序号01234567891011
DatacbegfD
DatacbegfDa
Cur92345678010110
3假设将循环队列定义为:
#defineMaxQSize6
typedefintElemType;
typedefstruct{
ElemType*base;
intrear;
intlength;
}Queue;
其中域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。
(a,c,f,g){a,c,f,e,d}
k=515
(a,b)14
(a,c,f,d,g){a,c,f,e,d,g}
k=615
(a,b){a,c,f,e,d,g,b}
15.下图中的顶点表示村庄,有向边代表交通路线,若要建立一家医院,试问建在哪一个村庄能使各村庄总体交通代价最小?
解:
该图的邻接矩阵如下:
利用Floyd算法可求得两顶点之间最短路径长度。最后求得:
case ']':
GetTop(s,x);
if(x=='[') Pop(s,x);
else return FALSE;
break;
default:
break;
}
i++;
}
if(s.size!=0) return FALSE;
return TRUE;
}
5多维数组A[5][3][4][2][2][2]初始化后;写出下面结构体中dim、以及bound、constants指针所指数组的值;总共有多少个元素?
从A4中可求得每对村庄之间的最少交通代价。假设医院建在i村庄时,其他各村庄往返总的交通代价如下所示:
医院建在村庄0时,各村庄往返总的交通代价为12+16+4+7+13+16+4+18=90;
医院建在村庄1时,各村庄往返总的交通代价为13+29+17+20+12+11+8+5=115;
医院建在村庄2时,各村庄往返总的交通代价为16+11+12+6+16+29+12+34=136;
答:
(1)
(2)
bcdefgS
k=115
(a,b)2
(a,c)12
(a,d){a,c}
k=215
(a,b)12
(a,d)10
(a,c,e)6
(a,c,f){a,c,f}
k=315
(a,b)11
(a,c,f,d)10
(a,c,e)16
(a,c,f,g){a,c,f,e}
k=415
(a,b)11
(a,c,f,d)16
活动a1a2a3a4a5a6a7a8a9a10
最早发生时间0003322675
最晚开始时间0010131001
l - e0010131001
关键路径:v1v2v5v7
v1v4v5v7
关键活动:a1a2a4a8a9
14.已知加权有向图G的邻接矩阵如下:
(1)画出该有向图G
(2)试利用Dijkstra算法求G中从顶点a到其他各顶点间的最短路径,并给出求解过程。
ASL=(9×1+4×2)/13=17/13
19.已知一关键码序列为:3,87,12,61,70,97,26,45。试根据堆排序原理,填写完整下示各步骤结果。
建立堆结构:97,87,26,61,70,12,3,45
交换与调整:
(1)87 70 26 61 45 12 3 97;(2)70,61,26,3,45,12,87,97;
解答:
17.设哈希(Hash)表的地址范围为0~17,哈希函数为:H (K)=K MOD 16, K为关键字,用线性探测再散列法处理冲突,输入关键字序列: (10,24,32,17,31,30,46,47,40,63,49)造出哈希表,试回答下列问题:
(1)画出构造的哈希表;
(2)若查找关键字63,需要依次与哪些关键字比较?
q.length++;
出队列时:
e=q.base[(q.rear+MaxQSize-q.length)%MaxQSize];
q.length--;
4试写一个判别表达式中括号()、[]是否配对的算法。
解:
BOOLIsmatching(char a[])
{
inti=0;
Stack s;
InitStack(s);
试给出此循环队列的队满条件,并写出相应的入队列和出队列时rear和length如何变化。
解:
队空条件:q.length=0;
队满条件:(q.rear+1)%MaxQSize==(q.rear+MaxQSize-q.length)%MaxQSize
入队列时:
q.base[q.rear]=e;
q.rear=(q.rear+1)%MaxQSize;
(3)61 45 26 3 12 70 87 97;(4)45,12,26,3,61,70,87,97;
(5)26 12 3 45 61 70 87 97;(6)12,3,26,45,61,70,87,97;
(7)3 12 26 45 61 70 87 97;
其中横线上是要求考生自己填入的数据。
20.内排序的过程中,通常需要对待排序的关键字集合进行多遍扫描。采用不同排序方法,会产生不同的中间结果。设要将序列(Q,H,C,Y,P,A,M,S,R,D,F,X)中的关键字按字母序的升序重新排列,请分别给出对该序列进行冒泡排序,初始步长为4的希尔排序及以第一个元素为分界元素的快速排序的第一趟划分结果,并给出对该序列作堆排序时初始建堆的结果。
6已知一棵二叉树的中序序列和后序序列分别为DGBAECHF和GDBEHFCA,画出该二叉树,并写出其先序序列。
答案:ABDGCEFH
A
BC
D EF
GH
7设给定权集w={5,25,3,6,10,4},试构造关于w的一棵哈夫蔓树,并求其加权路径长度WPL。
答案:
wpl=(3+4)*4+(5+6)*3+10*3+25=116
ElemTypex;
while(a[i]){
switch(a[i])
{Βιβλιοθήκη Baidu
case '(':
Push(s,a[i]);
break;
case '[':
Push(s,a[i]);
break;
case ')':
GetTop(s,x);
if(x=='(')Pop(s,x);
else return FALSE;
break;
Cur82345670910110
序号0的存储单元为空闲链头结点,序号1的存储单元为工作链头结点;请分别画出删除e后的链表图和添加a后链表图(都是在该图的基础上进行)。
解:
删除e后的链表图:
序号01234567891011
DatacbgfD
Cur42358670910110
添加a后链表图:
序号01234567891011
(3)若查找关键字60,需要依次与哪些关键字比较?
(4)假定每个关键字的查找概率相等,求查找成功时的平均查找长度。
查找关键字63时,依次与关键字31、31、17、46、47进行了比较。
查找关键字60时,与12号地址比较,因12号地址没有数据,可知查找失败。
查找成功时的平均查找长度ASL=(6×1+1×2+3×5+1×6)/11=29/11
(1)冒泡排序(H,C,Q,P,A,M,S,R,D,F,X,Y)
(2)初始步长为4的希尔排序(P,A,C,S,Q,D,F,X,R,H,M,Y)
(3)快速排序(F,H,C,D,P,A,M,Q,R,S,Y,X)
初始建堆:(Y,S,X,R,P,C,M,H,Q,D,F,A)
(2)V1V2V3V4V5V6
(3)(4)见教材。
13、已知AOE网中顶点分别表示7个事件,有向线段分别表示10个活动,线段旁的数值表示每个活动花费的天数,如下图所示。请用顶点序列表示出关键路径,给出关键活动。
解:
事件v1v2v3v4v5v6v7
最早发生时间03267510
最晚发生时间03367610
医院建在村庄3时,各村庄往返总的交通代价为4+8+12+3+4+17+12+22=82;
医院建在村庄4时,各村庄往返总的交通代价为18+5+34+22+7+20+6+3=115。
显然,把医院建在村庄3时总体交通代价最少。
16.给出数据序列:52、33、74、25、18、36、29,请构造一棵AVL树。(不要求给出详细构造过程,只给出最后结果即可)。
表中黄色代表1次比较,红色代表2次比较,绿色代表5次比较,灰色代表6次比较。
18.有数据序列:47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89,10,哈希函数为:Hash(key)=key mod 18,用链地址法处理冲突,请构造哈希表并求出在等概率查找时查找成功的平均查找长度。
8画出以下二叉树对应的森林
答案:
9求具有12个结点的完全二叉树度为2,为1和为0的结点个数。
答案:
n0=6
n2=5
n1 =1
10.写出计算二叉树叶子节点个数的递归算法
答案:
intcountLeaf(BiTreeT )
{
if(!T)
return 0;
else if(!T->lchild&& !T->rchild)
typedefstruct
{
ELemType*base; //数组元素基址
intdim; //数组维数
int*bound; //数组各维长度信息保存区基址
int*constants; //数组映像函数常量的基址
}Array;
解:
dim=6
数组元素序号012345
Bound所指数组的值534222
constants所指数组的值96328421
return 1;
else
return(countLeaf(T->lchild) +countLear(T->rchild));
}
11.已知某图的邻接表为
(1).写出此邻接表对应的邻接矩阵;
(2).写出由v1开始的深度优先遍历的序列;
(3).写出由v1开始的深度优先的生成树;
(4).写出由v1开始的广度优先遍历的序列;
(5).写出由v1开始的广度优先的生成树;
解:略。
12、下图为一个连通网。
(1)画出该网的邻接矩阵表示。
(2)写出从v1出发对该网的广度优先搜索序列。
(3)从v1开始,给出用Prim算法构造该网的最小生成树的过程。
(4)给出用Kruskal算法构造该网的最小生成树的过程。
解:(1)该图的邻接矩阵表示如右图:
1编写算法求出带头结点的单链表的长度;
解:
intListLength_L(LinkList&L)
{
inti=0;
LinkListp=L;
if(p) p=p-next;
while(p){
p=p->next;
i++;
}
returni;
}
2假设静态链表的结构如下图:
序号01234567891011
DatacbegfD
DatacbegfDa
Cur92345678010110
3假设将循环队列定义为:
#defineMaxQSize6
typedefintElemType;
typedefstruct{
ElemType*base;
intrear;
intlength;
}Queue;
其中域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。
(a,c,f,g){a,c,f,e,d}
k=515
(a,b)14
(a,c,f,d,g){a,c,f,e,d,g}
k=615
(a,b){a,c,f,e,d,g,b}
15.下图中的顶点表示村庄,有向边代表交通路线,若要建立一家医院,试问建在哪一个村庄能使各村庄总体交通代价最小?
解:
该图的邻接矩阵如下:
利用Floyd算法可求得两顶点之间最短路径长度。最后求得:
case ']':
GetTop(s,x);
if(x=='[') Pop(s,x);
else return FALSE;
break;
default:
break;
}
i++;
}
if(s.size!=0) return FALSE;
return TRUE;
}
5多维数组A[5][3][4][2][2][2]初始化后;写出下面结构体中dim、以及bound、constants指针所指数组的值;总共有多少个元素?
从A4中可求得每对村庄之间的最少交通代价。假设医院建在i村庄时,其他各村庄往返总的交通代价如下所示:
医院建在村庄0时,各村庄往返总的交通代价为12+16+4+7+13+16+4+18=90;
医院建在村庄1时,各村庄往返总的交通代价为13+29+17+20+12+11+8+5=115;
医院建在村庄2时,各村庄往返总的交通代价为16+11+12+6+16+29+12+34=136;
答:
(1)
(2)
bcdefgS
k=115
(a,b)2
(a,c)12
(a,d){a,c}
k=215
(a,b)12
(a,d)10
(a,c,e)6
(a,c,f){a,c,f}
k=315
(a,b)11
(a,c,f,d)10
(a,c,e)16
(a,c,f,g){a,c,f,e}
k=415
(a,b)11
(a,c,f,d)16
活动a1a2a3a4a5a6a7a8a9a10
最早发生时间0003322675
最晚开始时间0010131001
l - e0010131001
关键路径:v1v2v5v7
v1v4v5v7
关键活动:a1a2a4a8a9
14.已知加权有向图G的邻接矩阵如下:
(1)画出该有向图G
(2)试利用Dijkstra算法求G中从顶点a到其他各顶点间的最短路径,并给出求解过程。
ASL=(9×1+4×2)/13=17/13
19.已知一关键码序列为:3,87,12,61,70,97,26,45。试根据堆排序原理,填写完整下示各步骤结果。
建立堆结构:97,87,26,61,70,12,3,45
交换与调整:
(1)87 70 26 61 45 12 3 97;(2)70,61,26,3,45,12,87,97;
解答:
17.设哈希(Hash)表的地址范围为0~17,哈希函数为:H (K)=K MOD 16, K为关键字,用线性探测再散列法处理冲突,输入关键字序列: (10,24,32,17,31,30,46,47,40,63,49)造出哈希表,试回答下列问题:
(1)画出构造的哈希表;
(2)若查找关键字63,需要依次与哪些关键字比较?
q.length++;
出队列时:
e=q.base[(q.rear+MaxQSize-q.length)%MaxQSize];
q.length--;
4试写一个判别表达式中括号()、[]是否配对的算法。
解:
BOOLIsmatching(char a[])
{
inti=0;
Stack s;
InitStack(s);
试给出此循环队列的队满条件,并写出相应的入队列和出队列时rear和length如何变化。
解:
队空条件:q.length=0;
队满条件:(q.rear+1)%MaxQSize==(q.rear+MaxQSize-q.length)%MaxQSize
入队列时:
q.base[q.rear]=e;
q.rear=(q.rear+1)%MaxQSize;
(3)61 45 26 3 12 70 87 97;(4)45,12,26,3,61,70,87,97;
(5)26 12 3 45 61 70 87 97;(6)12,3,26,45,61,70,87,97;
(7)3 12 26 45 61 70 87 97;
其中横线上是要求考生自己填入的数据。
20.内排序的过程中,通常需要对待排序的关键字集合进行多遍扫描。采用不同排序方法,会产生不同的中间结果。设要将序列(Q,H,C,Y,P,A,M,S,R,D,F,X)中的关键字按字母序的升序重新排列,请分别给出对该序列进行冒泡排序,初始步长为4的希尔排序及以第一个元素为分界元素的快速排序的第一趟划分结果,并给出对该序列作堆排序时初始建堆的结果。