一、(15分)
回答下列各题,并简要说明理由,每题3分
1、什么是线形表?线形表的各元素类型是否必须是同一类型?为什么?
2、线形表有两种不同的继承形式,顺序的和链接的存储结构,
在使用时,如何确定使用哪种存储结构?
3、给出一个二叉树的前序和中序遍历序列,要求写出后序遍历序列。
4、(记不清楚具体数字了,大概的数字把)
一个文件用B+树做索引,给定文件大小2000000 B,每个页块大小为4000 B,
每个指针大小为5 B。每个记录是200 B,其中关键码为5 B.
问:
1)应采用多少阶B+树?
2)该文件索引块数目。
5、下列哪些可以做Hash函数?哪些效果不好?哪些效果好?
其中,n为Hash表的表长;Random(n)可以产生一个0---n=1 的随机数;
p(n)为小于n的素数。
1)Hash(key) = key/n;
2) Hash(key) = 1;
3) Hash(key) = (key + Random(n)) % n;
4) Hash(key) = key % p(n);
二、(5分)
证明:一棵二叉树的前序,中序,后序遍历序列中,叶结点的相对位置是不变的
三、(15分)
1)给定一组关键码,要求依次插入建立一棵AVL树,大约12个关键码左右,
(和03年那个真题只是关键码的不同)
需要旋转的时候,要求标出旋转的类型:左单旋,右单旋,先左后右双旋,先右后
左双旋。
2)在建成的这棵AVL树上,依次删除关键码****(四个),要求:
如果需要旋转,那要标出旋转类型;用中序的直接前驱代替关键码
四、(15分)
1)将书上284页的Dijkstra算法挖去5个空,让添。(5分)
具体字母有差别,但是确实就是那个算法,我按照书上的来了。
void ShortestPath(Graph
{
for (int i = 0; i < n; i++){ //n
dist[i] = Edge[v][i];
s[i] = 0;
if (i != v && dist[i] < MaxNum)
1空;
else
path[i] = -1;
}
s[v] = 1;
dist[v] = 0;
for (int i = 0; i < n - 1; i++){
float min = MaxNum;
int u = v;
for (int j = 0; j < n; j++){
if( 2空 && dist[j] < min){
u = j;
min = dist[j];
}
}
}
3空;
for (int w = 0; w < n; w++){
if( 4空 && Edge[u][w] < MaxNum && dist[u] + Edge[u][w] < dist
[w]){
dist[w] = dist[u] + Edge[u][w];
5空;
}
}
}
2)(10分)
定义了一个Max{***********},即顶点i到其余各顶点的最短路径的值,
让写一个算法求这个Max{***********}的最小值。