华东理工大学2001年数据结构与程序设计试题
一、单选题(10分)
1.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用------存储方式最节省运算时间。
A.单链表 B.仅有头指针的单循环链表
C.双链表 D.仅有尾指针的单循环链表
2.若在线性表中采用折半查找法查找元素,该线性表应该 。
A.元素按值有序 B.采用顺序存储结构
C.元素按值有序,且采用顺序存储结构
D.元素按值有序,且采用链式存储结构
3.对于给定的结点序列abcdef,规定进栈只能从序列的左端开始。通过栈的操作,能得到的序列为 。
A.abcfed B.cabfed C.abcfde D.cbafde
4.已知一算术表达式的中缀形式为A+BC-D/E,后缀形式为ABC +DE/-,其前缀形式为 。
A.-A+BC/DE B.-A+B CD/E
C.-+ABC/DE D.-+A BC/DE
5.如果n1和n2是二叉树T中两个不同结点,n2为n1的后代,那么按遍历二叉树T时,结点n2一定比结点n1先被访问。
A.前序 B.中序 C.后序 D.层次序
6.具有65个结点的完全二叉树其深度为 。(根的层次号为1)
A.8 B.7 C.6 D.5
7.已知二叉树的前序遍历序列是abdgcefh,中序遍历序列是dgbaechf,它的后序遍历序列是 。
A.bdgcefha B. gdbecfha C.bdgechfa D.gdbehfca
8.对于前序遍历和后序遍历结果相同的二叉树为 。
A.一般二叉树
B.只有根结点的二叉树
C.根结点无左孩子的二叉树
D.根结点无右孩子的二叉树
9.对于前序遍历与中序遍历结果相同的二叉树为 。
A.根结点无左孩子的二叉树
B.根结点无右孩子的二叉树
C.所有结点只有左子树的二叉树
D.所有结点只有右子树的二叉树
10.在有n个叶子的哈夫曼树中,其结点总数为 。
A.不确定 B.2n C.2n+1 D.2n-1
二、是非题(10分)
1.顺序存储方式只能用于存储线性结构。
2.消除递归不一定需要使用栈。
3.将一棵树转换成相应的二叉树后,根结点没有右子树。
4.完全二叉树可以采用顺序存储结构实现,存储非完全二叉树则不能。
5.在前序遍历二叉树的序列中,任何结点的子树的所有结点都是直接跟在该结点之后。
6.邻接表法只能用于有向图的存储,而邻接矩阵法对于有向图和无向图的存储都适用。
7.在一个有向图的邻接表中,如果某个顶点的链表为空,则该顶点的度一定为零。
8.二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值,小于其右孩子的值。
9.最佳二叉排序树的任何子树都是最佳二叉排序树。
10.对两棵具有相同关键字集合的而形状不同的二叉排序树,按中序遍历它们得到的序列的顺序是一样的。
三、问答题
(应届生限做2,3,4,5题;在职生任选做四题;共40分)
1.(10分)什么是广义表?请简述广义表与线性表的主要区别。
2.(10分)下图表示一个地区的通讯网,边表示城市间的通讯线路,边上的权表示架设线路花费的代价。
①请分别给出该图的邻接表和邻接矩阵,要求每种存储结构能够表达出该图的全部信息,并分别对这二种形式中每个部分的含义(物理意义)予以简要说明。
②若假设每个域(包括指针域)的长度为一个字节,请分别计算出这二种结构所占用的空间大小。
3.(10分)已知如下所示长度为12的表:
(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec)
①试按表中元素的顺序依次插入一棵初始为空的二叉排序树,请画出插入完成之后的二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。
②若对表中元素先进行排序构成有序表,求在等概率的情况下对此有序表进行折半查找时查找成功的平均查找长度。
③按表中元素顺序构造一棵平衡二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。
4.(10分)在起泡排序过程中,有的关键字在某趟排序中可能朝着与最终排序相反的方向移动,试举例说明之。快速排序过程中有没有这种现象?
5.(10分)调用下列函数f(n),回答下列问题:
①试指出f(n)值的大小,并写出f(n)值的推导过程;
②假定n=5,试指出f(5)值的大小和执行f(5)的输出结果。
C函数
int f(int n)
{ int i,j,k,sum=0;
for(j=1;i<n+1 i++)
{ for(j=n;j>i-1;j--)
for(k=1;k<j+1;k++)
suni++;
prinft("sum=%d\n",sum);
}
return(sum);
}
Pascal函数
FUNCTION f(n:integer):integer;
VAR i,j,k,sum,integer;
BEGIN .
sum:=0;
FOR i:=1 TO n DO
BEGIN
FOR j:=n DOWN i DO
FOR k:=1 TO j DO
sum:=sum+1
writeln('sum=',sum)
END;
f:=sum
END;
四、编写算法
(应届生限做1、2、3、4题,在职生任选四题,每题10分,共40分)
1.(10分)利用两个栈S1和S2模拟一个队列,写出入队和出队的算法(可用栈的基本操作)。
栈的操作有:
makeEmpty(s:stack); 置空栈
push(s:stack;value:datatype); 新元素value进栈
pop(s:stack):datatype; 出栈,返回栈顶值
isEmpty(s:stack):boolean; 判栈空否
队列的操作有
enQtleue(s1:stack;s2:stack;value:datatype);元素value进队
deQueue(s1:stack;s2:stack):datatype; 出队列,返回队头值
2.(10分)试写出给定的二叉树进行层次遍历的算法,在遍历时使用一个链接队列。
3.(10分)试写一个算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i<>j)。假设分别基于下述策略:
1)图的深度优先搜索;
2)图的广度优先搜索;
4.(10分)设二叉排序树中关键字由1至1000的整数构成,现要检索关键字为531的结点,下述关键字序列中哪些可能是二叉排序树上搜索到的序列,哪些不可能是二叉排序树上搜索到的序列,哪些不可能是二叉排序树上搜索到的序列?
a)800,399,588,570,500,520,566,531
b)730,355,780,390,701,401,530,531
c)732,321,712,385,713,392,531
d)8,578,555,340,433,551,550,450,531
通过对上述序列的分析,试写一个算法判定给定的关键字序列(假定关键字互不相同)是否可能是二叉排序树的搜索序列。若可能则返回真,否则返回假。可假定被判定的序列已存入数组中。
5.(10分)编写一个在非空的带表头结点的单链表上实现就地排序的程序。(不额外申请新的链表空间)