【题目归档】考研数据结构算法题目归档
数据结构算法题目归档
一、顺序表类
(1) 查找值
-
二分查找
-
编写二分查找的递归算法
-
找出数组中未出现的最小正整数
(2) 删除值
-
删除所有值为x的值
-
删除所有重复的值
-
删除给定值 s 与 t 之间的所有元素
(3) 合并顺序表
- 两个有序顺序表合并为一个新的有序顺序表。
(4) 顺序表内数据元素位置互换
-
一维数组 A[m+n] 中将两个顺序表m和顺序表n 的位置互换
-
原地全部逆置
-
一维数组R的序列循环左移p个位置
-
删除线性表 ai 和ai+n-1 共 n 个元素,并将之插入至原表中的第 j 个元素之前
-
设计将所有奇数移到所有偶数之前的算法
-
设计将所有负数均排在非负数之前的算法
-
编写算法,以第一个元素为基准,将小于该元素的结点全部放到前面,大于该元素的结点全部放到其后。
-
设有一组初始记录关键字序列 ( K1、K2、…、Kn ),要求设计一个算法能够在 O(n) 的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于 Ki,右半部分的每个关键字均大于等于 Ki。
-
将一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。输入一个已排好序数组的一个旋转,求该旋转数组的最小元素。如,数组 {3, 4, 5, 1, 2} 为有序数组{1, 2, 3, 4, 5}的一个旋转数组,该数组的最小值为1。
(5) 其他
-
设计在顺序存储结构上实现裁剪字符串的算法。
-
已知 A=(a1, a2, …, am),B=(b1, b2, …, bn)均为顺序表,试编写一个比较 A¸B 大小的算法
-
在数组中,某个数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如,在数组 {2, 4, 1, 16, 7, 5, 11, 9} 中,数对之差的最大值是 11,是 16 减去 5 的结果。
二、单链表类
1. 单个单链表算法题
(1) 删除值
-
非递增单链表,删除值相同的多余结点
-
递增单链表,删除值相同的多余结点
-
不带头结点,删除值为 x 的结点
-
带头结点,删除值为x的结点
-
带头结点,删除最小值
-
带头结点,删除给定的两个值之间的元素
-
带头结点的单链表保存 m 个整数,且 abs(data)<=n,(n为正整数), 对于链表中绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点
(2) 单链表内结点互换
-
带头结点,逆向输出每个结点的值
-
带头结点,就地逆置
-
编写算法要求按照输入顺序依次建立链表中各个结点
(3) 查找值
-
头插法建立单链表
-
尾插法建立单链表
-
查找链表倒数第 k 个位置上的结点
-
带头结点,求单链表中的结点个数
(4) 单链表排序
-
带头结点,元素递增有序
-
带头结点,递增输出元素,并释放结点存储空间
-
带头结点,循环单链表,递增输出元素,并释放结点存储空间直到表空,再删除表头结点
-
在链式结构上实现简单选择排序算法
-
判断单链表中元素是否是递增的算法
-
在链式存储结构上设计直接插入排序算法。
(5) 其他
-
判断带头结点的循环双链表中心对称
-
设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。
-
单链表有环,是指单链表的最后一个结点的指针指向了链表中的某个结点(通常单链表的最后一个结点的指针域是为空的)。试编写算法判断单链表是否存在环。
2. 多个单链表算法题
(5) 一个单链表分解 为两个
-
将单链表A分解为以下这种形式:A表含有原表中序号为奇数的元素,B表中含有原表中序号为偶数的元素。
-
带头结点的单链表C={a1,b1,a2,b2······am,bn}拆解为两个线性表,使得A={a1,a2···an},B = {bm,····b2,b1}。
-
已知集合A 和集合B存在,且分别带头结点的单链表L1 和 L2表示。编写算法实现集合运算: A = A - B
(6) 两个单链表归并为一个
-
两个递增的单链表归并为一个递减的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
-
两个有序单链表A和B的合并排序,可以把合并后的结果放在单链表C中。
-
找出两个链表的公共结点,输出是一条新的链表。
-
找出两个链表的公共结点的起始位置,输出是一个整数值。
-
带头结点且递增有序的单链表A和B,找出两个链表的公共元素值并存于单链表C中。
-
递增有序的单链表A和B,找出两个链表的公共元素存放于A链表中。
-
将循环单链表h2链接到h1之后,要求链接后的链表仍保持循环链表形式
(7) 一个单链表与另一个单链表的关系
- 判断单链表B中的序列是否是单链表A中序列的连续子序列
三、树和二叉树类
(1) 树的递归遍历
-
计算一棵给定二叉树的所有双分支结点个数
-
编写二叉树B中所有结点的左、右子树进行交换的函数
-
求先序遍历序列中第 k (1<=k<=二叉树中结点个数) 个结点的值
-
删除以元素值为x为根的子树
-
已知满二叉树的先序序列,求其后后序序列
-
判断两棵二叉树是否相同的算法
-
给定的表达式(二叉树)转换为等价的中缀表达式并输出
-
复制二叉树
-
设树的存储结构为孩子链表表示法。试编写一递归的先根遍历树的算法。
-
若在一棵已知的二叉树 T 中存在数据元素为 e1的结点,则删除该结点的右子树p;若存在数据元素为 e2的结点且该结点无右子树,则将 p插入为该结点的右子树。
(2) 树的结点相关
-
查找值为 x 的结点及其所有祖先
-
查找值为 j结点x在二叉树中的双亲结点算法
-
查找二叉树中某个结点x
-
指针p(非空)指向二叉树中的某个结点,试写出求p所指结点的中序后继的算法
-
查找二叉树中任意两个结点的最近公共祖先
-
统计以孩子兄弟表示法存储的森林的叶子结点数
-
统计以孩子兄弟表示法存储的树的叶子结点数
-
统计二叉树中度为 1 结点个数和度为 2 的结点个数
-
统计二叉树中度为 1 的结点数目,输出二叉树中所有的叶子结点
-
设计一个算法求其指定的某一层 k(k>1)的叶子结点个数
-
设计统计二叉树中所有结点值之和的算法
-
设计统计二叉树中所有结点数量的算法
-
设计统计二叉树中结点值为x的结点个数
(3) 求二叉树的高度或者宽度
-
非递归算法求二叉树的高度
-
递归算法求二叉树的高度
-
求非空二叉树b的宽度 (即具有结点数最多的那一层的结点个数)
-
以孩子兄弟链表为存储结构,请设计递归算法求树的深度
-
求二叉树中以元素值为 x 的结点为根的子树的深度
-
求森林的深度
(4) 树的非递归遍历
-
后序遍历二叉树的非递归算法
-
先序遍历非递归算法
-
中序遍历非递归算法
-
层次遍历算法 (无要求非递归)
-
编写算法要求不用递归也不用栈,返回二叉树T的后序序列中的第一个结点的指针
(5) 树的存储方法
-
建立一棵二叉树,要求以二叉链表存储结构存储
-
根据先序遍历和中序遍历建立二叉树
-
按给定的表达式建相应二叉树
-
判别给定二叉树是否是完全二叉树的算法
-
二叉树的叶结点连成一个单链表
-
已知一棵树的层次序列及每个结点的度,编写算法构造此时的以孩子兄弟链表为存储结构的树
-
以孩子兄弟链表为存储结构的树,编写算法,按(双亲、孩子)格式输出树中所有的边
树的应用
(6) 线索二叉树
-
在中序线索树 root 找出 x 结点的后继结点
-
在中序线索树 root 找出 q 所指结点的后继结点
-
在前序线索树中找出x结点的后继结点
-
编写实现二叉树后序线索化的算法
(7) 哈夫曼二叉树
-
求二叉树T的WPL的算法
(8) 二叉排序树
-
根据一组非零的整数序列建立一棵二叉排序树算法
-
判断给定的二叉树是否是二叉排序树
-
指定结点在给定二叉排序树中的层次
-
求出给定二又排序树中最小和最大的关键字
-
设计一个算法,从小到大输出二叉排序树中所有值小于 k 的关键字
-
在二叉排序树中查找关键字为key的结点。若找到,返回该结点的地址;否则返回NULL。
-
给出按由小到大顺序输出此二叉排序树中结点值的算法
-
编写一个递归算法,二又排序树上查找第k (1<k<n) 小的元素,并返回指向该结点的指针。要求算法的平均时间复杂度为O(log2n),二又排序树的每个结点中除data、lchild、rchild等数据成员外,增加一个count成员,保存以该结点为根的子树上的结点个数。
(9) 平衡二叉树
-
判断二叉树是否平衡二叉树的算法
-
使用递归方法,求各结点的平衡因子并输出
四、图类
(1) 图的存储结构和基本操作
-
写出从图的邻接表表示转换成邻接矩阵表示的算法
-
由依次输入的顶点数、弧数和各顶点信息、弧信息建立有向图的邻接表存储结构
-
设有向图的十字链表存储结构定义如下,试分别编写求图中顶点 i 的出度和入度的算法
-
写一建立图的邻接多重表存储结构的函数
-
已知某无向图采用邻接表作为存储结构。写一函数,删除图中的某一顶点 Vi 。
(2) 图的遍历
-
判断一个无向图G是否为一棵树
-
编写算法,判断邻接表表示的无向图是否是连通图(每一对结点均有路径相连)
-
写出图的深度优先搜索DFS算法的非递归算法
-
无向图采用邻接表方式存储,编写出广度优先遍历访问的算法
-
求无向图 G 的连通分量的算法。要求输出每一连通分量的顶点值。
-
无向图采用邻接表结构存储,要求按广度优先搜索统计连通子图的个数,并输出所有连通子图的生成树
-
无向图采用邻接表结构存储,要求按深度优先搜索统计连通子图的个数,并输出所有连通子图的生成树
(3) 图的路径
-
判断以邻接表方式存储的有向图中是否存在由顶点 vi 到顶点 vj 的路径,采用基于深度优先遍历判断
-
判断以邻接表方式存储的有向图中是否存在由顶点 vi 到顶点 vj 的路径,采用基于广度优先遍历判断
-
输出从顶点 Vi 到顶点Vj 的所有简单路径
-
已知有N个结点的无向图要求由根开始逐层输出连通子图中所有生成树中的各条边,边输出格式为 ( Ki ,Kj )
-
编写算法求有向图G中距离顶点V0 简单路径长度为 len 的所有顶点
(4) 图的拓扑序列
-
某有向图采用邻接表存储,编写算法输出该图的拓扑序列。
-
写一算法,判断有向图是否有回路。
(5) 图的应用
- 求最小生成树的算法,从N = (V,{E})中逐步去掉不合适的边,最终形成最小生成树,试设计这样的算法。
五、查找类
(1) 顺序查找和折半查找
-
写出折半查找的递归算法
-
按折半查找给定值为 key 的元素
(2) 哈希表
-
某关键字序列按除留余数法构建了哈希表,H(key) = key%P (P小于等于m),采用线性探测再散列解决冲突。编写算法,对给定长度为m、元素个数为 n 的哈希表(m大于等于n),计算等概率情况下查找成功的平均查找长度。
-
编写算法,依次输入n个整数,构造哈希表。哈希函数是除留余数法,处理冲突的方法采用线性探测再散列(假设表长是m,p是小于或等于m的最大质数)
-
编写算法,为依次输入的 n 个元素构造哈希表,H(x) 为哈希函数,以线性探测再散列解决冲突。
(3) 其他
- 线性表中各结点的检索概率不等时,可用如下策略提高顺序检索的效率:若找到指定的结点,则将该结点和其前驱结点(若存在)交换,使得经常被检索的结点尽量位于表的前端。试设计在顺序结构和链式结构的线性表上实现上述策略的顺序检索算法。
六、排序类
(1) 冒泡排序
- 双向冒泡排序算法
(2) 快速排序
-
试编写一个算法,使之能够在数组L[1..n]中找出第 k 小的元素
-
编写非递归的快速排序算法
-
找第k项.n个元素的第k项是把它们从小到大的排序后的第k个元素.如 (16,12,99,95,18,87,10)的第4项是18.假定n个整数放在数组a[1..n]中,试写一算法,不经对整个数组排序,找到第 k 项。并写出此算法在最好和最坏情况下的时间复杂度.(提示,利用快速排序中的划分方法)
(3) 堆排序
-
设关键字序列 ( K1、K2、…、Kn-1 ) 是堆,设计算法将关键字序列 ( K1、K2、…、Kn-1、X ) 调整为堆。
-
假设待排序的 n 个元素存放在数据 a[1···n]中,利用堆排序算法对 n 个元素进行升序排序。
(4) 直接插入排序
-
设顺序表用数组A[]表示,表中元素存储在数组下标1~m+n的范围内,前m个元素递增有序,后n个元素递增有序,设计一个算法,使得整个顺序表有序
-
在链式存储结构上设计直接插入排序算法。
(5) 简单选择排序
- 编写一个算法,在基于单链表表示的待排序关键字序列上进行简单选择排序。
(6) 归并排序
- 请采用递归方式实现二路归并排序程序MergeSort(data,first,last),在O(nlogn) 时间内完成排序,以数组D={8,6,4,10,5,3,7,18}为例,分析给出函数每一次递归调用的具体参数和顺序,以及对应的系统栈中的变化情况。
(6) 不能确定
-
荷兰国旗问题:设有一个仅由红、白、蓝三种颜色的条块组成的条块序列,请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。
-
已知线性表按顺序存储,且每个元素都是不相同的整数型元素,设计把所有奇数移动到所有偶数前边的算法(要求时间最少,辅助空间最少)。
-
欲有一个数组中存放了一个无序的关键序列K1、K2、···Kn。现要求将 Kn放在元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过 n 。
-
设有顺序 n 个盒子,每个盒子有一个小球,每个小球的颜色是红、白、蓝之一。要求重新安排这些小球,使得所有红色小球在前,所有白色小球居中,所有蓝色小球居后,重新安排时对每个小球的颜色只能看一次,并且只允许交换操作来调整小球的位置。
-
欲用四种颜色对地图上的国家涂色,有相邻边界的国家不能用同一种颜色。
七、 栈和队列及循环链表
(1) 队的出队入队
-
要求循环队列不损失一个空间全部都能得到利用,设置一个标志域tag,以tag为0或1来区分头尾指针相同时的列状态的空与满,请编写与此结构相应的出队算法。
-
设以顺序存储结构的循环队列的front 和 rear分别指示循环队列中队头和队尾元素,试写出相应的入队列和出队列的算法。
(2) 循环双链表
-
有一个带有头结点的循环双链表,表头指针为head,结点有四个域,data,flreg,llink,rlink,其中flreg记录结点数据的访问次数。假定链表的结点已按访问次数不增序排列。写一算法查找链表中是否有值为x的结点,如有,则让该结点的访问次数加1,并且要使链表仍保持不增序,如没有,则不作任何工作。
-
设有一个带头结点的、按元素值递减有序排列的双向循环列表,编写算法,插入一个元素并保持其有序性。
-
试设计将单向循环链表变为双向循环链表的算法
(3) 栈的应用
-
判别读入的字符序列是否为“回文”。
-
识别读入的一个字符序列是否为反对称的字符序列。
-
括号匹配的检验
-
若栈结构的存储采用带头结点的单链表实现,写出链栈的初始化、入栈和出栈的过程。
-
已知图两个栈S1,S2共享顺序存储空间 A[1···K],S1的栈底在 A[1]处,S2的栈底在A[K]处,试编写S1和S2的入栈算法和出栈算法。
-
请设计合理算法,在 O(n) 时间复杂度条件下,将中缀式a + 3b + 4(c-d)转化为对应的后缀表式并计算出表达式的值,若a=1,b=2,c=4,d=3,给出计算结果
(4) 循环单链表
- 写一算法,对一带头结点且仅设队尾指针的链式循环队列就地逆置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步