当前位置:问答库>考研试题

2018年西南科技大学计算机科学与技术学院814程序综合设计之数据结构教程考研核心题库

  摘要

一、算法设计题

1. 假定用两个一维数组L 【N 】和R 【N 】作为有N 个结点1,2,…,N

的二叉树的存储结构。

分别指示结点i 的左儿子和右儿子,

,使

) 表示i 的左(右) 儿子为空。试写一个

存放结点i 的父亲;然后再写一个判别结点u 是否

算法,由L 和R 建立一个一维数组为结点V 的后代的算法。

【答案】算法如下:

是含有N 个元素且指示二叉树结点i 左儿子和右儿子的一维数组

T 数组初始化

若结点i 的左子女是则结点L 的

双亲是结点

i

若结点i 的右子女是R , 则R 的

双亲是

i

判断U 是否是V 的后代

2. 已知顺序表中有m 个记录,表中记录不依关键字有序排列,编写算法为该顺序表建立一个有序的索引表,索引表中的每一项含记录的关键字和该记录在顺序表中的序号,要求算法的时间复杂度在最好的情况下能达到O(m)。

【答案】算法如下:

顺序表中记录个数

关键字

该关键字在顺序表中的下标

索引表的一项

关键字

记录中的其他数据

第 2 页,共 33 页

本算法据此建立结点i 的双亲数组T , 并判断结点U 是否是结点V 的后代

给有m 个记录的顺序表seq 建立索引表

index

监视哨

关键字放入正确位置

第i 个记录的下标

3. 假设在二叉链表的结点中增设两个域:parent 域指示其双亲结点:flag 域(取值为历的递推形式的算法。

【答案】算法如下:

在增加双亲指针

和标志域

的二叉树中,不用栈后序遍历二叉树

) 区分在遍

历过程中到达该结点时应继续向左、向右或访问该结点。试以此存储结构编写不用栈进行后序遍

向左

访问根结点

找被访问结点的双亲

结束

向右

第 3 页,共 33 页

4. 在二叉排序树的结构中,有些数据元素值可能是相同的,设计一个算法实现按递增有序打印结点的数据域,要求相同的数据元素仅输出一个,算法还应能报出最后被滤掉而未输出的数据元素个数,对如图所示的二叉排序树,输出为:10,12,13,15,18,21,27,35,42。滤掉3个元素。

【答案】算法如下:

递增序输出二叉排序树中结点的值,滤去重复元素

中序遍历左子树

是当前访问结点的前驱,调用本算法时初值为

null

记重复元素,调用

本算法时初值为

前驱后移

中序遍历右子树

结束

算法

5. 有n 个记录存储在带头结点的双向链表中,现用双向起泡排序法对其按上升序进行排序,请写出这种排序的算法(注:双向起泡排序即相邻两趟排序向相反方向起泡) 。

【答案】算法如下:

对存储在带头结点的双向链表head 中的元素进行双向起泡排序

设标记

双向链表尾,算法过程中是向上起泡的开始结点

是工作指针,指向当前结点

假定本趟无交换

第 4 页,共 33 页