山东大学软件学院数据结构练习题

 数据结构 参考答案

一 简答题

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分。

猜你喜欢

转载自blog.csdn.net/Sunnyztg/article/details/128367501