数据结构基础
文章平均质量分 69
常用
不导翁
这个作者很懒,什么都没留下…
展开
-
PTA 好后缀 (10分)(字符串匹配+前缀函数)
7-8 好后缀 (10分)我们称一个字符串的后缀为好后缀,如果它满足如下条件:(1)它在字符串中至少出现2次;(2)满足条件(1)的最长者。请编写程序计算一个字符串的好后缀长度,注意一个字符串不能称为自己的后缀。输入输出描述输入格式:输入为一个字符串,包含不超过10^5个字母。输出格式:输出为一个整数,表示输入字符串的好后缀长度。样例输入样例1:xacbacba输出样例1:4输入样例2:yxxabacaba输出样例2:3输入样例3:abc输出样例3:0原创 2020-11-12 15:31:43 · 1979 阅读 · 0 评论 -
数据结构-线段树
线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。线段树可以在O(log N)的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。线段树维护的信息,需要满足可加性,即能以可以接受的速度合并信息和修改信息,包括在使用懒惰标记时,标记也要满足可加性(例如取模就不满足可加性,对4取模然后对3取模,两个操作就不能合并在一起做)。定义结构体struct node { int l; // 线段树的左端点 int r; // 线段树原创 2021-07-08 20:57:00 · 255 阅读 · 0 评论 -
C语言链表操作
1.2 编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)基础上合并2个单链表,合并前后单链表保持递增或相等次序,显示合并前后单链表。注意不可存在内存泄漏。。输入格式:若干整数。输出格式:每个单链表输出占一行,元素间用分隔符分隔;共3行输入样例:100 2 3 -2 -8 -6 -9 -10 50 2 -1输出样例:2->原创 2021-03-29 20:59:19 · 3355 阅读 · 2 评论 -
PTA 小谢的工程任务 (30 分)(最小生成树)
小谢的工程任务 (30 分)小谢是一位刚刚搬到二维星球上居住的工程师,现在他要为该星球上的一个村庄铺设道路,规定该村庄有n个地点( 编号从1至n )需要铺设道路,只需要保证n个地点中任意两个地点都能连通( 即连通图 ),但是由于身处二维星球,并且每个地点被抽象为一个二维坐标系上的点(a,b),并且对于任意两个地点连通的代价不再与欧几里得距离有关了。假设地点A(x,y) , 地点B(p,q),现在规定为这两个地点之间铺设道路的代价为 min(∣x−p∣,∣y−q∣) ,这对于初来乍到的小谢来说有点困难,现在原创 2021-03-18 21:43:01 · 395 阅读 · 0 评论 -
PTA L2-035 完全二叉树的层序遍历(树的遍历)
L2-035 完全二叉树的层序遍历 (25分)一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。输入格式:输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。输出格式:在一行中输出该树的层序遍历原创 2020-12-14 14:46:56 · 1983 阅读 · 0 评论 -
PTA L2-011 玩转二叉树(树的遍历+改进code)
L2-011 玩转二叉树 (25分)给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:71 2 3 4 5 6 74 1 3 2原创 2020-11-24 23:19:17 · 171 阅读 · 0 评论 -
PTA L2-006 树的遍历(dfs + bfs + build Tree)
L2-006 树的遍历 (25分)给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:72 3 1 5 7 6 41 2 3 4 5 6 7输出样例:4 1 6 3 5 7 2解题由后序,中序可得先序原创 2020-11-23 23:37:39 · 194 阅读 · 0 评论 -
PTA L2-001紧急救援(Dijkstra算法应用)
L2-001 紧急救援 (25分)作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。输入格式:输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地原创 2020-11-19 21:58:18 · 2917 阅读 · 0 评论 -
PTA L2-004 这是二叉搜索树吗?(二叉树遍历)
L2-004 这是二叉搜索树吗? (25分)一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出原创 2020-11-23 20:13:14 · 263 阅读 · 0 评论 -
PTA 玩转二叉链表 (25分)(二叉树的遍历)
7-9 玩转二叉链表 (25分)设计程序,按先序创建二叉树的二叉链表;然后先序、中序、后序遍历二叉树。输入格式:按先序输入一棵二叉树。二叉树中每个结点的键值用字符表示,字符之间不含空格。注意空树信息也要提供,以#字符表示空树。输出格式:输出3行。第一行是先序遍历二叉树的序列,第二行是中序遍历二叉树的序列,第三行是后序遍历二叉树的序列。每行首尾不得有多余空格。序列中不含#。输入样例:ab##dc###输出样例:abdcbacdbcda解题题目给出的是一个dfs数的先序遍历,对于原创 2020-11-18 21:23:21 · 1529 阅读 · 0 评论 -
KMP匹配算法及应用(代码)
参考理解:https://oi-wiki.org/string/kmp/https://blog.csdn.net/daaikuaichuan/article/details/80719203构造next数组void get_next(int next_[], char str[]) { int len = strlen(str); next_[0] = 0; for (int i = 1; i < len; i++) { /*j表示上一个匹配的长度, j原创 2020-11-12 14:58:42 · 144 阅读 · 0 评论 -
PTA 小明打字 (10分)(数据结构 + 双向链表)
7-1 小明打字 (10分)小明正使用Microsoft Word打一篇文档,文档只包含a-z的小写字母和空格,在打字过程中可能会一次或多次按下Home键、End键、←方向键、→方向键、Insert键、Backspace键。请编写程序,给定小明在键盘上按键的序列,输出小明屏幕上最终显示的文本。 提示:Home键会将当前光标移至文本开始位置,End键当前光标移至文本尾,←键和→键会使当前光标左移或右移一个位置(如果光标在文档头则无法左移,光标在文档尾则无法右移),Insert键会在插入和替换文本间切换(默认原创 2020-11-11 23:29:04 · 6615 阅读 · 7 评论 -
线段树
参考:https://oi-wiki.org/ds/seg/1.建立线段树void build(int s, int t, int p) { // 对 [s,t] 区间建立线段树,当前根的编号为 p if (s == t) { d[p] = a[s]; return; } int m = (s + t) / 2; build(s, m, p * 2), build(m + 1, t, p * 2 + 1); // 递归对左右区间建树 d[p] = d[p *转载 2020-10-28 17:30:13 · 217 阅读 · 0 评论 -
C++优先队列简单使用
简单使用详细参考:https://blog.csdn.net/disguise666/article/details/85989788struct Student{ //简单起见,只定义两个成绩变量 int num; int math;};struct cmp{ bool operator ()(const Student s1, const Student s2){ return s1.math < s2.math; //最大优先队列, 如原创 2020-10-24 09:50:09 · 170 阅读 · 0 评论 -
三分法查找
我们都知道 二分查找 适用于单调函数中逼近求解某点的值。如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点。下面的方法应该是三分查找的一个变形。如图所示,已知左右端点L、R,要求找到白点的位置。思路:通过不断缩小 [L,R] 的范围,无限逼近白点。做法:先取 [L,R] 的中点 mid,再取 [mid,R] 的中点 mmid,通过比较 f(mid) 与 f(mmid) 的大小来缩...转载 2020-05-05 11:03:50 · 571 阅读 · 0 评论 -
平衡二叉树(AVL)插入与删除
单旋与双旋解释结构定义typedef struct AVLTNode{ int Data; AVLTNode *Left; AVLTNode *Right; int Height; //树高} * AVLTree;单旋与双旋/*LL左单旋算法*/AVLTree SingleLeftRotation(AVLTree A) //能进入这一步A必须有一个左子结点B{ AVL...原创 2020-03-25 19:13:34 · 313 阅读 · 1 评论 -
二叉搜索树(BST)
结构定义#include <iostream>#include <algorithm>using namespace std;/*二叉树结构定义*/typedef struct TNode{ int Data; TNode *Left; TNode *Right;} * BinTree;查找/*递归查找*/BinTree FindRecur...原创 2020-03-24 16:51:22 · 183 阅读 · 0 评论 -
散列查找
散列函数的构造方法数字关键词的散列函数构造直接定址法h(key) = a * key + b; //a, b为常数void h(int key){ int }原创 2020-03-20 15:36:31 · 350 阅读 · 0 评论 -
并查集Find+Union
int Find(int Set[ ], int x)/*找某个元素所在的集合*/int FindSet1(int Set[], int x){ for ( ; Set[x] >= 0; x = Set[x]) ; return x;}/*FindSet的路径压缩 当Find一颗很高的树时,多次Find会效率很低 解决办法就是每次Find都将高度降低 利用递归,每次查找到...原创 2020-03-18 14:51:09 · 92 阅读 · 0 评论 -
堆的实现(优先队列)
结构定义#include <iostream>#include <algorithm>using namespace std;const int MaxV = 100;const int MaxData = 1000; //大于最大堆中所有元素可能的值typedef struct HNode{ int *Data; //储存元素的数组 int Size;...原创 2020-03-14 22:00:23 · 186 阅读 · 0 评论