上数据结构期末图知识题目解析.docx
《上数据结构期末图知识题目解析.docx》由会员分享,可在线阅读,更多相关《上数据结构期末图知识题目解析.docx(11页珍藏版)》请在冰豆网上搜索。
上数据结构期末图知识题目解析
2014上数据结构期末复习大纲
一.期中前以期中考试试卷复习,算法要真正理解
二、二叉树、图、排序算法将是考试重点(占60%左右)
三、要掌握的算法
1.二叉树的链表表示
2.建立二叉树的链表存储结构
3.先序、中序、后序遍历二叉树(递归算法)
4.遍历算法的应用(如求二叉树的结点数)
5.建立huffman树和huffman编码
6.图的邻接矩阵表示和邻接链表表示
7.图的深度优先遍历和广度优先遍历算法
8.有向图求最短路径(迪杰斯特拉算法)
9.直接插入排序算法
10.shell排序(排序过程)
12.堆排序(排序过程)
练习题
1.有8个结点的无向图最多有B条边。
A.14B.28C.56D.112
2.有8个结点的无向连通图最少有C条边。
A.5B.6C.7D.8
3.有8个结点的有向完全图最多有C条边。
A.14B.28C.56D.112
4.用邻接表表示图进行广度优先遍历时,通常是采用B来实现算法的。
A.栈B.队列C.树D.图
5.用邻接表表示图进行深度优先遍历时,通常是采用A来实现算法的。
A.栈B.队列C.树D.图
A.0243156
B.0136542
C.0423165
D.0361542
建议:
0134256
6.已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是*(C)
7.已知图的邻接矩阵同上题,根据算法,则从顶点0出发,按深度优先遍历的结点序列是(D)
A.0243156B.0135642C.0423165D.0134256
8.已知图的邻接矩阵同上题6,根据算法,则从顶点0出发,按广度优先遍历的结点序列是(B)
A.0243651B.0136425C.0423156D.0134256
9.已知图的邻接矩阵同上题6,根据算法,则从顶点0出发,按广度优先遍历的结点序列是(C)
A.0243165B.0135642C.0123465D.0123456
10.从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为(C)。
A.归并排序B.冒泡排序C.插入排序D.选择排序
11.从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为(D)。
A.归并排序B.冒泡排序C.插入排序D.选择排序
12.对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为(D)。
A.n+1B.nC.n-1D.n(n-1)/2
13.若一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为(C)。
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
14.堆是一种(B)排序。
A.插入B.选择C.交换D.归并
15.若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为(B)。
A.79,46,56,38,40,84B.84,79,56,38,40,46
C.84,79,56,46,40,38D.84,56,79,40,46,38
二、填空题(每空1分,共20分)
1.图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。
2.有向图G用邻接表矩阵存储,其第i行的所有元素之和等于顶点i的出度。
3.n个顶点e条边的图,若采用邻接矩阵存储,则空间复杂度为O(n2)。
4.n个顶点e条边的图,若采用邻接表存储,则空间复杂度为O(n+e)。
5.设有一稀疏图G,则G采用邻接表存储较省空间。
6..设有一稠密图G,则G采用邻接矩阵存储较省空间。
7.图的逆邻接表存储结构只适用于有向图。
8.图的深度优先遍历序列不是惟一的。
9.n个顶点e条边的图采用邻接矩阵存储,深度优先遍历算法的时间复杂度为O(n2);若采用邻接表存储时,该算法的时间复杂度为O(n+e)。
10.n个顶点e条边的图采用邻接矩阵存储,广度优先遍历算法的时间复杂度为O(n2);若采用邻接表存储,该算法的时间复杂度为O(n+e)
11.用Dijkstra算法求某一顶点到其余各顶点间的最短路径是按
路径长度递增的次序来得到最短路径的。
三、简答题.
1.已知如图所示的有向图,请给出该图的:
(1)
每个顶点的入/出度;
(2)邻接矩阵;
(3)邻接表;
(4)逆邻接表。
2.已知一个无向图的邻接表如图2所示,要求:
(1)画出该无向图;
(2)根据邻接表,分别写出用DFS(深度优先搜索)和BFS(广度优先搜索)算法从顶点V0开始遍历该图后所得到的遍历序列。
答
(1)
(2)根据该无向图的邻接表表示,从顶点V0开始的深度优先遍历序列为:
V0、V2、V3、V1、V4、V6、V5。
广度优先遍历序列为V0、V2、V5、V6、V1、V3、V4。
3.、图3所示为一个有向网图及其带权邻接矩阵,要求对有向图采用Dijkstra算法,求从V0到其余各顶点的最短路径,写出执行算法过程中各步的状态。
3、求解过程如下表所示。
终点
从v0到各终点的D值和最短路径的求解过程
i=1
i=2
i=3
i=4
i=5
V1
∞
∞
∞
∞
∞
无
V2
10(v0,v2)
V3
∞
60(v0,v2,v3)
50
(v0,v4,v3)
V4
30
(v0,v4)
30
(v0,v4)
V5
100
(v0,v5)
100
(v0,v5)
90
(v0,v4,v5)
60(v0,v4,v3,v5)
Vj
V2
V4
V3
V5
S
{v0,v2}
{v0,v2,v4}
{v0,v2,v3,v4}
{v0,v2,v3,v4,v5}
4.设待排序的关键字序列为{12,2,16,30,28,10,16*,20,6,18},试分别写出使用以下排序方法,每趟排序结束后关键字序列的状态。
(1).直接插入排序
(2)希尔排序(增量选取5,3,1)
(3)快速排序
(1)直接插入排序
[212]1630281016*20618
[21216]30281016*20618
[2121630]281016*20618
[212162830]1016*20618
[21012162830]16*20618
[210121616*2830]20618
[210121616*202830]618
[2610121616*202830]18
[2610121616*18202830]
(2)希尔排序(增量选取5,3,1)
102166181216*203028(增量选取5)
621210181616*203028(增量选取3)
2610121616*18202830(增量选取1)
(3)快速排序
枢轴
12[6210]12[283016*201618]
6[2]6[10]12[283016*201618]
28261012[181616*20]28[30]
18261012[16*16]18[20]2830
16*26101216*[16]18202830
5.设待排序的关键字序列为{30,60,8,40,70,12,10},试使用堆排序,
(1)画出将无序数据建成初始堆的图,
(2)画出将第二个数排定顺序时的堆的图。
答
(1)初始堆序列为7060124030810
(2)
交换60和8
四、程序填空题
1、根据有向图的邻接矩阵求出序号为numb的顶点的度数(邻接矩阵可参考简答题第三题),
请填写算法中下划线的空白处。
intdegree2(Graph&ga,intnumb)
{inti,j,d=0;
for(j=0;jif(ga.arcs[numb][j]!
=0&&ga.arcs[numb][j]!
=MAXINT)
d++;
for(i=0;iif(ga.arcs[I][numb]!
=0&&ga.arcs[I][numb]!
=MAXINT)
d++;
return(d);
}
2..已知r[1..n]是n个记录的递增有序表,用折半查找法查找关键字(key)为k的记录。
如果查找失败,,则输出“失败”,函数返回值为0;否则输出“成功”,函数返回值为该记录的序号值。
Intbinary_search(structrecordtyper[],intn,keytypek)
/*r[1..n]为N个记录的递增有序表,k为关键字*/
{intmid,low=1,hig=n;
while(low<=hig)
{mid=(low+hig)/2;
if(k(1)hig=mid-1;
elseif(k==r[mid].key){printf(“成功”);
(2)returnmid;}
else(3)low=mid+1;}
if(low>high)printf(“失败”);
return(0);
}
3.建立huffman树
voidHuffmanCoding(HuffmanTree&HT,int*w,intn)//算法6.12
{//w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
intm,i,s1,s2,start;
unsignedc,f;
HuffmanTreep;
char*cd;
if(n<=1)
return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p)
(*p).parent=0;
for(i=n+1;i<=m;++i)//建赫夫曼树
{//在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
select(HT,i-1,s1,s2);
ht[s1].parent==I;
ht[s2].parent==I;
ht[i].lchild=s1;
ht[i].lchild=s2;
ht[i].weight=ht[s1].weight+ht[s2].weight;
}
}
六.编程题
1.期中考试二个程序题(循环队列入队出队、用栈处理进制转换(P48算法3.1)
2.以二叉链表作为二叉树的存储结构,编写以下算法:
(看实习题)
(1)写出先序、中序、后序遍历二叉树的递归算法;
(1)统计二叉树的结点个数。
3.带头结点的单链表的插入和删除算法。
(书上P30算法2.9,2.10)
答.1.期中循环队列入队出队
#defineMAX20
typedefstruct{
intqu[MAX];
intrear,length;
}Queue;
IntEnQueue(Queue&q,inte)
{if(q.length==MAX)return-1;
q.rear=(q.rear+1)%max;
q.length=q.length+1;
q.qu[q.rear]=e;
return1;
}
IntDeQueue(Queue&q,int&e)
{intfront;
if(q.length==0)return-1;
front=(q.rear+1+MAX-q.length)%max;
e=q.qu[front];
q.length--;
return1;
}