数据结构
faaarii
努力变优秀
展开
-
二叉树的前中后非递归遍历
非递归前序遍历:1> 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++;2> 进入while循环,栈顶指针不为-1,则进入while循环,输出当前栈顶元素p的数据域,代表前序遍历的第一个结点为根结点;3> 如果当前的p结点拥有右子树,将这个右子树结点存入栈中,没有则不存;因为栈的特点是先进后出,所以先存右子树,在存左子树;...转载 2020-07-11 17:07:29 · 307 阅读 · 0 评论 -
数据结构之线性表小结
以下都是用自己的话来总结的,可能和专业术语有偏差(大鸟勿喷),留给自己复习使用啦一、数据结构:其实就是在你编写一个程序之前,你所用到的数据想用怎样方式存起来:固定长度的静态存储(顺序存储,一般用数组)、变长的动态存储(链式存储,一般用指针),除此之外,数据之间也会有一定的联系,方便互相找到彼此(逻辑结构,常用的有:集合,线性结构,树结构,图结构)用课本上的话来说就是:数据结构分为逻辑结构(...原创 2020-06-23 15:46:47 · 375 阅读 · 0 评论 -
java实现哈夫曼编码(优先队列)
简单介绍;哈弗曼编码(前缀编码):---哈夫曼树(最优二叉树)可以得到前缀编码,字符串的二进制编码,不是固定长度的,对于词频高的可以短编码,词频低的可以长编码,可以压缩数据,用于通信。前缀编码:更准确的译码,一个字符的编码不是另一个的前缀。利用二叉树来设计前缀编码,左0右1算法思想:目的是:得到一个带权值的wpl(带权路径长度最小),每次把权值最小的两棵树合并,直到形成一个二叉树...原创 2020-06-23 15:42:53 · 312 阅读 · 0 评论 -
字符串的输入输出处理(c++,java)
题目描述字符串的输入输出处理。输入第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。输出先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。样例输入2www.dotcpp.com DOTCPPA C MD O ...原创 2020-04-25 21:13:52 · 561 阅读 · 0 评论 -
字符串分类统计C++
题目描述输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。输入一行字符输出统计值样例输入aklsjflj123 sadf918u324 asdf91u32oasdf/.';123样例输出23 16 2 4使用库函数<ctype.h>int isalnum(int c)该函数检查传递的字符是否是字母数字。in...原创 2020-04-25 14:46:23 · 3137 阅读 · 0 评论 -
字符串排序
题目描述输入三个字符串,按由小到大的顺序输出输入3行字符串输出按照从小到大输出成3行样例输入cdeafgabc样例输出abcafgcde#include<iostream>#include<cstring>#include<cmath>#include<vector>#include...原创 2020-03-28 20:49:03 · 482 阅读 · 0 评论 -
基数排序(c++)
思想:不是比较也不是移动而是根据关键字两个要点:基;序列中数的最大位数,个位,十位,百位,,桶:0-9基本步骤:待排序列afor(每一位i){ for:遍历数组a,计算当前位数的值b,放到对应的桶里bucket[b]=a for:遍历桶,把桶里的数放回数组a中}时间复杂度O(n) 内排 稳定#include<iostre...原创 2020-03-28 16:26:51 · 314 阅读 · 0 评论 -
归并排序(c++)
将有序表两两归并成有序表归并算法左表右表,利用那个辅助表同时遍历左表右表,找出最小值#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=1001;int a[N];int n;void Merge(in...原创 2020-03-28 16:23:21 · 167 阅读 · 0 评论 -
选择--堆排序(c++)
大根堆---建立升序小根堆--建立降序堆排序:1,建立堆2,排序--将根节点与最后一个节点交换,然后将除了最后一个元素的剩余元素向下调整成大根堆,重复操作为什么这么做:可以确认第k大如果用小根堆建立升序,拿掉根节点最小元素一方面是他破坏了最小堆结构,其次不能确定第k小元素**建堆的时候,扫描调整len/2~1**自下而上调整时,找孩子中最大的时间复杂度O...原创 2020-03-28 16:19:42 · 115 阅读 · 0 评论 -
选择--简单排序(c++)
思想;找出最小值进行交换,i+1~n中找出最小值与i交换时间复杂度O(n2) 内排 不稳定#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=100001;int a[N];int n;void selectSor...原创 2020-03-28 16:06:58 · 121 阅读 · 0 评论 -
交换--快速排序算法(c++)
分支的思想,选第一个元素作为轴值将序列进行分解,通常我们将待排序列中的第一个元素为轴值,利用一个划分函数找到轴值的位置,划分函数是将小于轴值的数放在轴值的左边,大于轴值的数放在轴值的右边快排:找到轴值,轴值左边快排,轴值的右边进行快排#include<iostream>#include<cstring>#include<cmath>using...原创 2020-03-28 16:02:33 · 162 阅读 · 0 评论 -
交换--冒泡排序(c++)
思想:不停的比较交换冒泡:序列中消除所有的逆序对,有个flag来标记时候进行交换,如果没被标记--没有交换没有逆序对,已经达到有序时间复杂度O(n2) 内排 稳定#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using name...原创 2020-03-28 15:54:39 · 120 阅读 · 0 评论 -
插入--希尔排序(C++)
思想:直接插入的基础上加上步长,在步长的范围内进行操作时间复杂度O(n2) 内排 不稳定#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=1001;int a[N];int n;int d,i,j;//d为步长,在...原创 2020-03-28 15:49:15 · 84 阅读 · 0 评论 -
插入--折半排序(c++)
思想:直接插入的基础上,再找插入位置的步骤上进行了优化,利用分治的思想,最终high+1是最终要插入的位置,先进行移动,然后插入时间复杂度O(n2) 内排 稳定#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using namesp...原创 2020-03-28 15:46:22 · 243 阅读 · 0 评论 -
插入--直接插入算法(c++)
思想:比较,移动,插入假设待排序列中的第一个元素是有序的,剩余的无序序列挨个的插入有序的序列中,从无序的第一个元素开始,把这个数存到哨兵里,比较前面的数,比前面的数小,需要插入到这个数的前面,插到前面那个位置需要不停地和前面的数比较,大的数往后移动,最后找到位置插入时间复杂度O(n2) 内排 稳定#include<iostream>#include<cst...原创 2020-03-28 15:42:35 · 752 阅读 · 0 评论 -
Floyd(弗洛伊德)最短路径算法
输入输入的第一行包含1个正整数n,表示图中共有n个顶点。其中n不超过50。以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。输出共有n行,每行有n个整数,表示源点至每一个顶点的最短路径长度。如果不存在从源点至...原创 2020-03-20 11:24:07 · 492 阅读 · 0 评论 -
最小生成树prim(c++)
输入输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。以后的n行中每行有n个用空格隔开的整数,对于第i行的第j个整数,如果不为0,则表示第i个顶点和第j个顶点有直接连接且代价为相应的值,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图,且保证图中只有一个连通分量。输出只有一个整数,即最小生成树的...原创 2020-03-18 19:36:30 · 645 阅读 · 0 评论 -
Dijkstra单元最短路径,最小堆优化,SPFA算法求单源最短(c++)
介绍原理的有很多,所以直接附上代码:输入输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。输出只有一行,共...原创 2020-03-18 19:34:53 · 363 阅读 · 0 评论 -
判断两个二叉排序树(二叉搜索树)是否相同
题目描述判断两序列是否为同一二叉搜索树序列输入开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。输出如果序列相同则输出...原创 2020-03-01 22:24:28 · 705 阅读 · 0 评论 -
二叉树遍历(已知前序,中序,求后序遍历)java
题目描述二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。输入两个字符串,其长度n均小...原创 2020-03-01 20:39:55 · 904 阅读 · 0 评论 -
二叉排序树的前中后遍历(java)
题目描述输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。输入输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。输出可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。样例输入12 28 15 421 ...原创 2020-03-01 17:08:01 · 230 阅读 · 0 评论 -
求完全二叉树的结点个数(二叉树任意一子树的结点个数)
如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。 比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。输入输入数据包括多行,每行给出一组测试...原创 2020-03-01 15:24:37 · 856 阅读 · 0 评论 -
合根植物 java(并查集)
问题描述 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。 如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?输入格式 第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,...原创 2020-02-25 18:47:28 · 190 阅读 · 0 评论 -
小计算器(java)bufferreader的好处、java封装任意进制间的转换
问题描述 模拟程序型计算器,依次输入指令,可能包含的指令有 1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个当前进制的数 2. 运算指令:'ADD','SUB','MUL','DIV','MOD',分别表示加减乘,除法取商,除法取余 3. 进制转换指令:'CHANGE K',将当前进制转换为K进制(2≤K≤36) 4. 输出指令:'EQUAL',以...原创 2020-02-25 16:08:06 · 304 阅读 · 0 评论 -
蓝桥杯 油漆面积--java
题目描述X星球的一批考古机器人正在一片废墟上考古。该区域的地面坚硬如石、平整如镜。管理人员为方便,建立了标准的直角坐标系。每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。经过各种测量,每个机器人都会报告一个或多个矩形区域,作为优先考古的区域。矩形的表示格式为(x1,y1,x2,y2),代表矩形的两个对角点坐标。为了醒目,总部要求对所有机器人选中的矩形区域涂黄色油漆...原创 2020-02-24 15:39:37 · 206 阅读 · 0 评论 -
[蓝桥杯]FBI树 -java实现
题目描述我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:1)T的根结点为R,其类型与串S的类型相同;2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S...原创 2020-02-22 20:33:46 · 334 阅读 · 0 评论 -
蓝桥杯-国王的烦恼-java实现(并查集)
题目描述C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达...原创 2020-02-20 19:34:11 · 437 阅读 · 2 评论 -
java有序线性表的有序合并
已知线性表 LA 和 LB 中的数据元素按值非递减有序排列,现要求将 LA 和 LB 归并为一个新的线性表 LC, 且 LC 中的数据元素仍然按值非递减有序排列。例如,设LA=(3,5,8,11) ,LB=(2,6,8,9,11,15,20) 则LC=(2,3,6,6,8,8,9,11,11,15,20)输入有多组测试数据,每组测试数据占两行。第一行是集合A,第一个整数m(0<...原创 2020-02-18 17:16:44 · 1286 阅读 · 0 评论 -
集合union
你的任务是先输出集合A和集合B中的元素,每个集合在一行中输出。然后每次在将集合B中的元素取出插入到集合A尾部后输出集合A中的元素。当然你的代码可以和上面的代码不一样,只要有相同的输出即可。输入有多组测试数据,每组测试数据占两行。第一行是集合A,第一个整数m(0<m<=100)代表集合A起始有m个元素,后面有m个整数,代表A中的元素。第二行是集合B,第一个整数n(0<n&...原创 2020-02-18 17:03:38 · 213 阅读 · 0 评论 -
java迷宫问题--广度优先算法
题目描述小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。小明只能向上下左右四个方向移动。输入输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。每组输入的第一行是两个整数N和M(1<=N,M<=100)。接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。字符的含义如下:‘S’:起点‘E’:终点‘-’:空地,可以通过‘#...原创 2020-02-17 18:17:57 · 1089 阅读 · 0 评论 -
翻硬币 java解决
题目描述小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。比如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两...原创 2020-02-13 18:32:44 · 305 阅读 · 0 评论 -
区间K大数查询
输入格式第一行包含一个数n,表示序列长度。第二行包含n个正整数,表示给定的序列。第三个包含一个正整数m,表示询问个数。接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。思路 将数组排序,查找第K大import java.util.Arrays;import java.util.Scanner...原创 2020-02-12 17:09:06 · 112 阅读 · 0 评论 -
约瑟夫环问题(c++)
约瑟夫环问题总时间限制:1000ms内存限制:1000kB描述约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。输入8 1 3 (n=8 k=1 m=3 )输出7 (剩下的...原创 2019-03-31 19:17:18 · 2228 阅读 · 0 评论 -
PTA--最大子列和问题
01-复杂度1最大子列和问题(20分)给定K个整数组成的序列{N1,N2, ...,NK},“连续子列”被定义为{Ni,Ni+1, ...,Nj},其中1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和...原创 2019-03-23 22:03:42 · 519 阅读 · 0 评论