- 博客(15)
- 收藏
- 关注
原创 二叉树
二叉树的定义与性质定义二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。如上图就是一个二叉树。特点每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一颗子树,也要区分它是左子树还是右子树。五种基本形态空二叉树只有一个根节点根结...
2020-04-19 15:15:44
233
原创 数据结构--树
树的定义与基本使用树的定义我们生活中会了解到许多树,门前的核桃树,松树等,我们这里要讨论另一种在数据结构例定义的树。树是n个结点的有限集。n=0时称为空树。在任意一颗非空树中:有且仅有一个特定的成为根的结点;当n>1时,其余结点可分为m个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树。注:1.n>0时根结点是唯一的,不可能存在多个根节点...
2020-04-10 22:48:15
154
原创 数据结构--线性表
线性表的定义与基本使用定义线性表是一个序列,元素之间是有序列的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。如果一个元素有两个前驱或后继,就不算是有序排列。并且线性表是有限的,无限的数列,只存在于数学的概念中。若将线性表记为(a1,…,ai-1,ai,ai+1,…,an),则表中ai-1是ai的前驱,ai+1是ai的后继,并且都是唯一的。线性...
2020-04-02 16:33:19
356
原创 最小生成树
图的最小生成树例.(注:以上图片截自《啊哈!算法》)上题就是图的最小生成树的最简单的一个例子,输入数据为n,m,n是路口的个数,m代表路的个数,接下来m行,代表一个路口到另一个路口的路径,并且可以看出是无向图。既然是要总长度最小,所以我们这里先选择最小的边,然后选择次小边,直到选择n-1条边(因为n-1条边足够连接所有路口)。这里我们需要用到结构体存储每一条边。struct edge{...
2020-03-31 13:01:51
125
原创 最短路径
求最短路径的几种算法弗洛伊德(暴力)此算法同冒泡排序相似,代码简单但时间复杂度高。如上图(选自《啊哈!算法》),数字代表城市,箭头代表城市之间的距离,并且是单向箭头求各个城市之间的最短路径。我们可以假设现在允许通过城市1,那么城市3到城市2的距离就变成9,以此类推。代码实现:for(j=1;j<=n;j++){ for(k=1;k<=n;k++) { ...
2020-02-19 20:01:53
348
原创 图的遍历
图的遍历图的遍历主要是由深搜和广搜来完成的,基本上没什么难点。例1.第一行输入两个数字n和m,n表示n个数,m表示n个数之间有m条连线;接下来m行每行有两个数,代表这两个数之间的连线,遍历这张图,每个数出现一次。例2.第一行输入两个数字n和m,n表示n个数,m表示n个数之间有m条单向连线;接下来m行每行有三个数,第三个数代表前两个数之间的连线长度,输出由1到n的最短步数。话不多说,上代码:...
2020-02-18 14:35:52
186
原创 广度搜索
广度搜索的基本使用方法广度搜索不同于深度搜索,是一种一步一步进行的过程,每一个点只记录一遍。需要用到队列记录每一步可以走到的位置,找到目标位置输出步数即可。用到的知识:结构体、队列如图首先我们需要定义一个结构体来存储每个遍历到的点和步数struct node{ int x; int y; int s;};广搜不会用到递归,所以可以直接在主函数里写,这里需要定义一个结构体队列...
2020-02-14 15:18:29
343
原创 深度优先搜索
深度优先搜索的基础用法深搜是一种不撞南墙不回头的算法,即是有序的尝试每一种可能的情况。用到的知识:递归先来看一个全排列的例子。例1.输出1~n的全排列并计算排列总和。很明显,暴力枚举也可以做,但时间复杂度肯定过高,深搜可以解决这种问题。我们假设有九个格子,手上有九张扑克牌,因此我们需要两个全局数组变量来记录格子里的数和手上还剩什么牌,还需要两个全局变量保存n和排列总数。int a[1...
2020-02-09 22:17:15
124
原创 枚举
枚举的基础使用枚举的基本思想就是有序的去尝试每一种可能。(若有错误,还请大佬指正)例1._ _ + _ = _ _ 在每一条横线上边填入正确的数使等式成立,并且1~9每个数均只出现一次1.创建两个数组及三个变量用来遍历和计数int i,sum,t;int a[11],b[11];2.遍历for(a[1]=1;a[1]<=9;a[1]++) for(a[2]=1;a[2]&...
2020-02-07 18:16:16
139
原创 栈
用栈判断回文的基础用法本文是用栈判断回文字符串的基本解法解读。栈是一种后进后出的数据结构,类似于羽毛球筒,最后装进去的是第一个被取出来使用。例:给出一个字符串,判断其是否回文。1.读取字符串并求出长度及中点(回文必须中间对称)char a[101];gets(a);len=strlen(a);mid=len/2;2.创建一个栈并将mid之前的字符存入栈int i,top=0;...
2020-02-06 16:42:41
76
原创 队列
队列的用法示例以下为使用结构体实现队列的操作解决问题的一个示例(如有错误,还请大佬们指正):例.给出一串数字,首先将第 1个数删除,紧接着将第 2个数放到 这串数的末尾,再将第 3个数删除并将第 4个数放到这串数的末尾,再将第 5个数删除…… 直到剩下后一个数,将后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起输出。1.首先创建一个结构体存储一个数组以及两个变量struct qu...
2020-02-01 17:24:55
129
原创 快速排序
快速排序的基本用法以下是本人对快速排序的一些看法(如有错误,还请大佬们指正):快速排序申请的空间比桶排序要小,比冒泡排序的速度快,用法很广泛,以下是快速排序的基本使用方法:1.快排是一步一步将每一个基准数归位的过程2.快速排序需要用到递归,创建函数是一个比较方便的方法,并且创建两个全局变量在子函数中用到int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 vo...
2020-02-01 16:05:39
176
原创 冒泡排序
冒泡排序的基本用法冒泡排序申请的空间比桶排序要小,但不如桶排序快,以下是冒泡排序的基本使用方法:1.创建三个中间变量及一个数组并给其赋值int i,m,j;int a[11]={0,3,6,2,5,66,9,3,1,100};2.由下标从小到大遍历,依次将最小的放在前面for(i=0;i<9;i++){ for(j=i+1;j<10;j++) { ...
2020-02-01 13:47:03
104
原创 桶排序
桶排序的简单使用桶排序算是所有排序里最快速的排序,但是申请空间一般比其他排序要大得多,一下是桶排序的基本使用方法:1.创建两个中间变量及两个数组并给其一个赋值并给另外一个赋0 int i,j; int a[10]={0,2,4,1,4,6,7,9,5,44}; int b[100]={0};2.遍历a数组中的值,并将其做b数组的下标+1 for(i=0;i<10;i++) {...
2020-02-01 13:31:32
76
原创 链表的创建
链表的创建及其增删查改链表链表的使用是在结构体和指针的基础上实现的创建链表的过程需要用到malloc()函数和free()函数定义结构体struct Node{ int data; struct Node *next;};创建函数struct Node *Creat() //创建函数 { struct Node *Head,*p1,*p2; //定义头节点及中间变量 ...
2019-12-22 16:15:43
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人