数据结构 参考答案
一 简答题
1、若元素的进栈序列为A,B,C,D,E,运用栈操作,能否得到出栈序列B,C,A,E,D和D,B,A,C,E,为什么?
答:评分标准 (1)答对一个1分,(2)2分
(1)能得到出栈序列B,C,A,E,D。过程如下:A, B进,B出;然后C进,C,A依次出栈;接下来D,E先后入栈,出栈得到E,D,
不能得到D,B,A,C,E
(2)因为栈后进先出
2、请给出四维数组的列主映射函数。
答:评分标准 答对得4分。
假设四维数组A[u1,u2,u3,u4],任一元素A[j1,j2,j3,j4]的列主映射函数。
Map(j1,j2,j3,j4)=j4*u1*u2*u3+j3*u1*u2+j2*u1+j1
3、已知一棵二叉树的前序遍历为ABDEGCFH,中序遍历为DBGEACFH,求二叉树的后序遍历。
答:评分标准
(1)仅画出二叉树得2分
(2)后序遍历正确2分(直接得到后续遍历4分)
二叉树 A
B C
D E F
G H
后序遍历为: DGEBHFCA
二、应用题
1、设散列长度为13,散列函数Hash(k)=k%11,若输出序列为{22,41,53,46,30,13,1,67},解决溢出的方法为线性开型寻址散列。
(1)请构造该散列表
(2)搜索元素30和元素67所需要比较的次数是多少?
(3)给出删除元素1后的散列表结构
答:评分标准(1)5分,部分答对酌情给分(2)3分,答对一个1.5分(3)2分,部分答对酌情给分
(1)构造的散列表:
Index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
Content |
22 |
1 |
46 |
13 |
67 |
41 |
53 |
30 |
(2)搜索30:3次 搜索67:4次
(3)删除元素1后的散列表:
Index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
Content |
22 |
67 |
46 |
13 |
41 |
53 |
30 |
2、一个nⅹn的矩阵M是一个反对角矩阵当且仅当对于所有满足i+j≠n+1的i和j有M(i,j)=0
(1)给出一个4ⅹ4反对角矩阵的样例
(2)设计一种映射模式,用来把一个反对角矩阵映射到一个大小为n的一维数组之中。
答:评分标准(1)5分(2)5分
(1)
其中,非零数字1可以替换为任意整数数字
(2)当i+j=n+1时,map(i,j)= n-j 或 map(i,j)= n-i
当i+j≠n+1时,值为0
三 算法题
1、设计将整数数组所有奇数移到所有偶数之前的算法,要求算法时间复杂度最优。叙述算法思想并用C++实现,分析其时间复杂度。
评分标准:
算法思想:可以使用类似快排的方法进行比较,定义左右两个指针,左边向右找偶数,右边向左找奇数,如果遇到则进行交换,直到左指针大于等于右指针结束交换。得8分
void quickpass(int r[], int s, int t)
{
int i=s,j=t,x=r[s];
while(i<j)< p="">
{
while (i<j && r[j]%2==0) j=j-1; if (i<j) {r[i]=r[j];i=i+1;}
while (i<j && r[i]%2==1) i=i+1; if (i<j) {r[j]=r[i];j=j-1;}
}
r[i]=x;
} 得4分
上述算法的时间复杂度为O(n),得3分
若使用冒泡或其他算法,描述正确的,酌情给分
2、
答: 评分标准:
通常我们所使用的先序、中序和后序遍历对于叶结点的访问都是从左到右的顺序,这里我们选择中序递归遍历。算法思想:设置前驱结点指针pre,初始为空。第一个叶结点由指针head指向。遍历到叶结点时,就将它前驱的rchild指针指向它,最后一个叶结点的rchild为空。得7分。
算法实现如下:
LinkedList head, pre=NULL; //全局变量
LinkedList InOrder(BiTree bt){
if(bt){
InOrder(bt->lchild); //中序遍历左子树
if(bt->lchild==NULL&&bt->rchild==NULL) //叶结点
if(pre==NULL){
head=bt;
pre=bt;
} //处理第一个叶结点
else{
pre->rchild=bt;
pre=bt;
} //将叶结点链入链表
InOrder(bt->rchild); //中序遍历右子树
pre->rchild=NULL; //设置链表尾
}
return head;
} 得5分。
上述算法的时间复杂度为O(n),辅助变量使用head和pre,栈空间复杂度为O(n)。
得3分。