2018年北京市培养单位计算机与控制学院408计算机学科专业基础综合之数据结构考研基础五套测试题
● 摘要
一、算法设计题
1. 设计将数组A[n]中所有的偶数移到奇数之前的算法。要求不增加存储空间,且时间复杂性为〇(n)。
【答案】算法如下:
//n个整数存于数组A 中,本算法将数组中所有偶数排在奇数之前
//用类C 语言编写,数组下标从0开始
//交换A[i]与
A[j]
//算法Arrange 结束
2. 已知关键字序列(
试写出一算法将(
利用(1)的算法写一个建大根堆的算法。 【答案】(1)算法如下:
''
假设
是大堆,本算法把
(2)
3. (1)试分别找出满足下列条件的所有二叉树:(a)前序序列和中序序列相同:(b)前序序列和后序序列相同;(c)中序序列和后序序列相同。
(2)已知非空二叉树的结点结构为(lchild,data , rchild) ,设计算法:从右向左依次将所有叶子的数据值放到向量(假定向量的空间大于叶子的总个数) 中。
【答案】(1)满足条件的二叉树如下:
(a)若前序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树。
第 2 页,共 37 页
) 是大根堆。
) 调整为大根堆;
调成大堆
(b)若前序序列与后序序列相同,则或为空树,或为只有根结点的二叉树。
(c)若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树。 (2)算法如下:
全局变量
从右向左依次将二叉树bt 的所有叶子的数据值放到a 向量中 .
中序遍历右子树
叶结点
中序遍历左子树
4. 编程:假设以数组Q[m]存放循环队列中的元素,同时以rear 和length 分别指示环形队列中的队尾位置和队列中所含元素的个数。试给出该循环队列的队空条件和队满条件,并写出相应的初始化(initqueue),插入(enqueue)和删除(dequeue)元素的操作。
【答案】定义队列:
//循环队列占m 个存储单元
//rear指向队尾元素,length 为元素个数
(1)设cq 是seQueue 类型变量,则当(2)队列的初始化:
//cq为循环队列,本算法进行队列初始化
//算法结束 (3)队列的插入:
//cq是已如上定义的循环队列,本算法将元素x 入队
//队满
.
//计算插入元素位置
//将元素x 入队列
//修改队列长度
//算法结束
//cq是已如上定义的循环队列,本算法是出队算法,且返回出队元素
第 3 页,共 37 页
时队列空,当 时队列满。
(4)队列的删除:
//队空
;//出队元素位置
//修改队列长度
//返回队头元素
//算法结束
5. 设单链表的表头指针为h ,结点结构由data 和next 两个域构成,其中data 域为字符型。写出算法dc(h,n) ,判断该链表的前n 个字符是否中心对称。例如xyx ,xyyx 都是中心对称。
【答案】算法如下:
//h是带头结点的n 个字符元素的单链表,本算法判断链表是否中心对称
//i记下结点个数,s 是字符栈
//P是链表的工作指针,指向待处理的当前元素
//链表前一半元素入栈
//恢复最后的i 值
//若n 是奇数,后移过中心结点
//测试
是否中心对称
//链表中心对称
//链表不中心对称
//算法结束
二、应用题
6. 阅读下面的算法,说明算法实现的功能。
【答案】本算法功能是将两个无头结点的循环链表合并为一个循环链表。headl 最后一个结点的链域指向head2,head2最后一个结点的链域指向headl ,headl 为结果循环链表的指针。
第 4 页,共 37 页