一、选择题 (20 分 每空2分)
1.___ 的遍历仍需要栈的支持。
1.前序线索树 2.中序线索树 3.后序线索树
2.若度为m的哈夫曼树中,其叶结点个数为n,则非叶结点的个数为___。
1.n-1 2.[n/m]-1 3.[(n-1)/(m-1)] 4.[n/(m-1)]-1 5.[(n+1)/(m+1)]-1
3.最优二叉树(哈夫曼树)、最优查找树均为平均查找路径长度∑wh最小的树,其中对最优二叉树,n表示___,对最优查找树,n表示___; 构造这两种树均___。
1.结点数 2.叶结点数 3.非叶结点数 4.度为二的结点数 5.需要一张n各关键字的有序表
6.需要对n个关键字进行动态插入 7.需要n个关键字的查找概率表 8.不许要任何前提
4.对于前序遍历与中序遍历结果相同的二叉树为___; 对于前序遍历与后序遍历结果相同的二叉树为___。
1.一般二叉树 2.只有根结点的二叉树 3.根结点无左孩子的二叉树
4.根接点无右孩子的二叉树 5.所有结点只有左子树的二叉树 6所有结点只有右子树的二叉树
5.m路B+树是一棵___, 其结点中关键字最多为___个, 最少为___个。
1.m路平衡查找树 2.m路平衡索引树 3.m路trie树 4.m路键树 5.m-1 6.m 7 m+1 8.[m/2]-1
9.[m/2] 10.[m/2]+1
二、填空题(10 分,每空一分)
1.对于给定的n个元素,可以构造出的逻辑结构有___,___,___,___四种。
2.具有n个关键字的B-树的查找路径长度不会大于___。
3.克鲁斯卡尔算法的时间复杂度为___, 他对___图较为适合。
4.深度为k(设根的层数为1)的完全二叉树至少有___个结点, 至多有___个结点, k和结点数n之间的关系是___。
三、问答题(10 分,每题5分)
1.一棵非空的有向树中恰有一个顶点入度为0,其他顶点入度为1.但一个恰有一个顶点的入度为0, 其他顶点入度为一的有向图却不一定是一棵有向树。请举例说明之。
2.若有n个元素以构成一个小根堆,那么如果增加一个元素为K(n+1),请用文字简要 说明你如何在log2(n) 的时间内将其重新调整为一个堆?
四、阅读下述程序,指出程序的输出。(10 分)
void g(int**);
main(){
int line[100],i;
int *p=line;
for(i=0;i<100;i++){
*p=i;
g(&p);
}
for(i=0;i<100;I++)printf("%d\n",line[i]);
}
void g(int**p){
(**p)++;
(*p)++;
}
五、编程题。(共50分,要求写出设计思想和程序注解)
1.设一单向链表的头指针为head,链表的记录中包含着整数类型的key域,试设计算法, 将此链表的记录按照key递增的次序进行就地排序.(10分)
2.给定一个整数数组b[0..N-1], b中连续相等元素构成的子序列称为平台.试设计算法,求出b中最长平台的长度.(20分)
3.自由树(即无环连通图) T=(V,E)的直径是树中所有点对间最短路径长度的最大值,即T的直径定义为MAX d(u,v) 这里d(u,v)表示顶点u 到顶点v的最短路径长度(路径长度为路径中所含的边数).试写一算法求T的直径,并分析算法的时间复杂度(时间复杂度越小得分越高)(20分)