算法笔记
文章平均质量分 66
阳光开朗男孩
躺平才是王道
展开
-
散列
前言给出N个正整数,再给出M个正整数,问这M个数中的每个数分别是否在N个数中出现过,其中N,M<=105,且所有正整数均不超过105。例如N=5,M=3,N个正整数为{8,3,7,6,2},欲查询的M个正整数为{7,4,2},于是后者中只有7和2在N个正整数中出现过,而4是没有出现过的。用空间换时间,即设定一个bool型数组hashTable[100010],其中hashTable[x]==true表示正整数x在N个正整数中出现过,而hashTable[x]==false表示正整数x在N个正整数中原创 2021-02-02 15:12:42 · 120 阅读 · 0 评论 -
背包问题
多阶段动态规划问题有一类动态规划可解的问题,它可以描述称为若干有序的阶段,且每个阶段的状态只和上一个阶段的状态有关,一般把这类问题称为多阶段规划问题。01 背包问题有 n 件物品,每件物品的重量为 w[i],价值为 c[i]。现有一个容量为 V 的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品都只有一件。样例5 8 // n =5 件物品, 容量为 V=83 5 1 2 2 // w[i] 重量4 5 2 1 3 // c[i] 价值令dp[i][v]表示前 i原创 2021-02-01 18:38:27 · 159 阅读 · 0 评论 -
DAG最长路
DAGDAG:就是有向无环图。DAG中的最长路:就是关键路径本节着重解决两个问题:1.求整个DAG中的最长路径(即不固定起点或终点)2.固定终点,求DAG的最长路径。求整个DAG中的最长路径(即不固定起点或终点)给定一个DAG,怎样求解整个图的所有路径中权值之和最大的那条如图11-6所示,路径(B,D,F,I)就是该图的最长路径,长度为9。如何定义状态令 dp[i]表示从i号顶点出发能获得的最长路径长度 。这样所有 dp[i] 的最大值就是整个DAG的最长路径长度。如何求解dp数组原创 2021-02-01 17:00:07 · 1490 阅读 · 0 评论 -
最长回文串
最长回文串给出一个字符串S,求S的最长回文子串的长度题目字符串“PATZJUJZTACCBCC”的最长回文子串为“ATZJUJZTA”,长度为9.分析令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串,是则为1,不是为0。这样根据S[i]是否等于S[j],可以把转移情况分为两类:①若S[i]=S[j],那么只要S[i+1]和S[j-1]是回文子串,S[i+1]至S[j-1]就是回文子串;如果S[i+1]至S[j-1]不是回文子串,则S[i]至S[j]一定不是回文子串。②若S[i原创 2021-02-01 16:17:14 · 83 阅读 · 0 评论 -
最长公共子序列
最长公共子序列给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)题目字符串“sadstory”和“adminsorry”的最长公共子序列为“adsory”,长度为6分析我们使用一个数组 dp[i][j] ,表示字符串 A 的 i 号位和字符串 B 的 j 号位之前的 LCS 长度(下标从 1 开始),如 dp[4][5] 代表 “sads” 和 “admin” 的LCS长度,那么可以根据 A[i] 和 B[j] 的情况,分为两种决策:1)原创 2021-02-01 15:55:57 · 78 阅读 · 0 评论 -
最长不下降子序列
最长不下降子序列(LIS)在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的。题目例如,现有序列A={1,2,3,-1,-2,7,9}(从下标1开始),它的最长不下降序列是{1,2,3,7,9},长度为5。另外,还有一些子序列是不下降子序列。分析令dp[i]表示以A[i]结尾的最长不下降子序列长度。这样对A[i]来说就会有两种可能1)如果存在A[i]之前的元素A[j](j < i),使得A[j]<=A[i]且dp[j]+1>dpi,那么就把原创 2021-01-30 17:25:16 · 1584 阅读 · 0 评论 -
最大连续子序列和
题目给定一个数字序列A1,A2,…,An,求i,j(1<=i<=j<=n),使得Ai+…+Aj最大,输出这个最大和。样例-2 11 -4 13 -5 -2显然11+(-4)+13=20为和最大的选取情况分析步骤1:令状态dp[i]表示以A[i]作为末尾的连续序列的最大和,以样例为例:序列-2 11 -4 13 -5 -2,下标分别记为0 1 2 3 4 5,那么dp[0]=-2dp[1]=11dp[2]=7(11+(-4)+13=20)dp[4]=15(因为由dp数原创 2021-01-30 11:04:05 · 218 阅读 · 0 评论 -
动态规划
动态规划动态规划:用来解决一类最优化问题的算法思想,将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。动态规划的递归写法以Fibonacci数列为例,F0=1, F1=1, Fn=Fn-1+Fn-2int F(int n){ if(n == 0 || n == 1) return 1; else return F(n-1) + F(n-2);}为了避免重复计算,可以开一个一维数组dp,用以保存已经计算过的结果,其中dp[n]记录F(n)的结果,并用d原创 2021-01-27 18:46:58 · 110 阅读 · 0 评论 -
贪心
简单贪心贪心法:总是考虑在当前状态下局部最优的策略,来使全局的结果达到最优。而要获得最优结果,则要求中间每一步策略都是最优的。月饼月饼是中国人在中秋节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价以及市场的最大需求量,试计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如有三种月饼,其库存量分别是18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么最大收益策略应该是卖出全部15万吨第原创 2021-01-26 18:43:31 · 152 阅读 · 0 评论 -
二分查找
二分查找二分查找是基于有序序列的查找算法。令[left,right]为整个序列的下标区间,然后每次测试当前[left,right]的中间位置mid=(left+right)/2,判断A[mid]与欲查询的元素x的大小。如果A[mid]==x,说明查找成功,退出查询如果A[mid]>x,说明元素x在mid位置的左边,因此往左子区间[left,mid-1]继续查找如果A[mid]<x,说明元素x在mid位置的右边,因此往右子区间[mid+1,right]继续查找例题从序列A={原创 2021-01-26 17:07:50 · 482 阅读 · 0 评论 -
随机数
生成随机数需要添加stdlib.h头文件与time.h头文件。首先在main函数开头加上srand((unsigned)time(NULL));,这个语句将生成随机数的种子;然后在需要使用随机数的地方使用rand()函数。#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){ srand((unsigned)time(NULL)); for(int i = 0; i < 1原创 2021-01-26 09:53:42 · 119 阅读 · 0 评论 -
快速排序
two pointerstwo pointers思想:先将A[1]存至某个临时变量temp,并令两个下标left、right分别指向序列首尾只要right指向的元素A[right]大于temp,就将right不断左移;当某个时候A[right]<=temp时,将元素A[right]挪到left指向的元素A[left]处。只要left指向的元素A[left]不超过temp,就将left不断右移;当某个时候A[left]>temp时,将元素A[left]挪到right指向的元素A[righ原创 2021-01-23 17:38:03 · 101 阅读 · 0 评论 -
归并排序
归并排序2-路归并排序:将序列两两分组,将序列归并为⌈n/2⌉个组,组内单独排序;然后将这些组再两两归并,生成⌈n/4⌉个组,组内再单独排序;以此类推,直到只剩下一个组为止,其核心在于如何将两个有序序列合并成一个有序序列。归并排序的时间复杂度为O(nlogn)。分组假设集合一共有n个元素,算法将会对集合进行逐层的折半分组。第一层分成两个大组,每组n/2个元素;第二层分成4个小组,每组n/4个元素;第三层分成8个更小的组,每组n/8个元素;…一直到每组只有一个元素为止。这样一来,整个数组就分原创 2021-01-23 16:47:10 · 146 阅读 · 0 评论 -
冒泡排序
冒泡排序冒泡排序:本质在于交换,每次通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束。算法原理这是一个无序数列:1、5、4、2、6、3,我们要将它按从小到大排序。按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置首先开始第一轮比较第一步:比较1和5,1比5小,顺序正确,元素位置不变第二步:比较5和4,5比4大,顺序错误,交换元素位置第三步:比较5和2,5比2大,顺序错误,交换元素位置经过一轮比较后,6作为最大的元素到了序列的最右原创 2021-01-23 16:21:59 · 90 阅读 · 0 评论 -
插入排序
直接插入排序直接插入排序:对序列A的n个元素A[1]~A[n],令i从2到n枚举,进行n-1趟操作。假设某一趟时,序列A的前i-1个元素A[1]~A[i-1]已经有序,而范围[i,n]还未有序,那么该趟从范围[1,i-1]中寻找某个位置j,使得将A[i]插入位置j后(此时A[j]到A[i-1]会后移至A[j+1]到A[i]),范围[1,i]有序。直接插入排序过程现在有一组待排序的初始关键字序列为{49 , 38 , 15 , 17 , 16 , 13 , 27 , 49},直接插入排序过程如下:原创 2021-01-23 16:00:16 · 208 阅读 · 1 评论 -
选择排序
简单选择排序:对一个序列A中的元素A[1]~A[n],令i从1到n枚举,进行n躺操作,每趟从待排序部分[i,n]中选择最小的元素,令其与待排序部分的第一个元素A[i]进行交换,这样A[i]就会与当前有序区间[1,i-1]形成新的有序区间[1,i]。于是在n躺操作后,所有元素就会是有序的。时间复杂度O(n^2):总共需要进行n趟操作,每趟操作选出待排序部分[i,n]中最小的元素,令其与A[i]交换void selectSort(){ for(int i = i; i <= n; i++){原创 2020-08-11 22:41:21 · 98 阅读 · 0 评论 -
拓扑排序
有向无环图有向无环图:如果一个有向图的任意顶点都无法通过一些有向边回到自身,称这个有向图为有向无环图。(DAG)拓扑排序拓扑排序:将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v前面。这个序列称为拓扑序列。定义一个队列Q,并把所有入度为0的结点加入队列。取队首结点,输出。然后删除所有从它出发的边,并令这些边到大的顶点的入度减1,如果某个顶点的入度减为0,则将其加入队列。反复进行2操作,直到队列为空。如果队列为空时入过原创 2021-01-23 15:29:28 · 169 阅读 · 0 评论 -
kruskal算法
kruskal算法kruskal算法:采用边贪心的策略。kruskal算法基本思想:在初始状态时隐去图中的所有边,这样图中每个顶点都自成一个连通块。之后执行下面的步骤:对所有边按边权从小到大进行排序按边权从小到大测试所有边,如果当前测试边所连接的两个顶点不在同一个连通块中,则把这条测试边加入当前最小生成树中;否则,将边舍弃。执行步骤2,直到最小生成树中的边数等于总顶点数减1或是测试完所有边时结束。而当结束时如果最小生成树的边数小于总顶点数减1,说明该图不连通。对下图进行kruskal算法步骤原创 2021-01-23 15:00:22 · 4289 阅读 · 0 评论 -
prim算法
prim算法prim算法(普利姆算法):对图G(V,E)设置集合S,存放已访问的顶点,然后每次从集合V-S中选择与集合S的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令顶点u为中介点,优化所有从u能到达的顶点v与集合S之间的最短距离。执行n次(n为顶点个数),直到集合S已包含所有顶点。算法实例演示首先让我们来看一个example。如下图所示,图a是一个连通图(右图是图a对应的邻接矩阵,假设图中的边的权值大于0),我们现在基于该图来演示Prim算法的过程。我们选择一个起点,然后在与起原创 2021-01-22 18:10:06 · 35257 阅读 · 4 评论 -
最小生成树
最小生成树及其性质最小生成树:在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。其中较粗的线即为最小生成树的边。边AB、BC、BD包含了图G的所有顶点,且由它们生成的树的边权之和为6,是所有生成树中权值最小的(边AD、BD、CD生成的树,其边权之和为7,大于之前给出的树的边权之和)。最小生成树的3个性质最小生成树是树,因此其边数等于顶点数减1,且树内一定不会有坏对给定的图G(V,E),其最小生成树可以不唯一,但其原创 2021-01-22 16:24:43 · 167 阅读 · 0 评论 -
Floyd算法
Floyd算法Floyd算法:用来解决全源最短路问题,对给定的图G(V,E),求任意两点u,v之间的最短路径长度。邻接矩阵实现Floyd算法非常合适。Floyd算法:如果存在顶点k,使得以k作为中介点时顶点 i 和顶点 j 的当前最短距离缩短,则使用顶点k作为顶点 i 和顶点 j 的中介点,即当dis[i][k]+dis[k][j]<dis[i][j]时,令dis[i][j] = dis[i][k]+dis[k][j](其中dis[i][j]表示从顶点 i 到顶点 j 的最短距离)。从V1到原创 2021-01-22 15:54:46 · 183 阅读 · 0 评论 -
SPFA算法
SPFA算法SPFA算法:对Bellman-Food算法的优化,只有当某个顶点u的d[u]值改变时,从它出发的边的邻接点v的d[v]值才有可能被改变。建立一个队列,每次将队首顶点u取出,然后对从u出发的所有边u->v进行松弛操作,也就是判断d[u]+length[u->v]<d[v]是否成立,如果成立,则用d[u]+length[u->v]覆盖d[v],于是d[v]获得更优的值,此时如果v不在队列中,就把v加入队列。直到队列为空(图中没有从源点可达的负环),或是某个顶点的入队次数超原创 2021-01-22 15:13:06 · 578 阅读 · 1 评论 -
Bellman-Ford算法
Bellman-Ford算法Bellman-Ford算法:求解有负权边的最短路径问题,也可以解决单源最短路径问题。环:从某个顶点出发、经过若干个不同的顶点之后可以回到该顶点的情况。零环、正环、负环:环A->B->C中的边权之和分别为0、正、负。由于零环和正环的存在不能使最短路径更短,则不会影响最短路径。而有负环,且从源点可以到达,则会影响最短路径的求解。但如果负环无法从源点出发到达,则最短路径的求解不会受到影响。Bellman-Ford算法设置一个数组d,用来存放从源点到达各个顶点的原创 2021-01-22 14:39:38 · 276 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法Dijkstra算法:用来解决单源最短路问题。给定图G和起点s,通过算法得到S到达其他每个顶点的最短距离。基本思想:对图G(V, E)设置集合S,存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短距离。这样的操作执行n次(n为顶点个数),直到集合S已包含所有顶点。有向非负带权如图所示:为了更加方便理解dijkstra算法,我们先把所有的有向边全部删掉,从原创 2021-01-21 18:58:15 · 28726 阅读 · 0 评论 -
图的遍历
用深度优先搜索(DFS)法遍历图深度优先搜索:每次都是沿着路径到不能再前进时才退到最近的岔道口。以一个有向图进行DFS遍历:从V0 开始进行遍历,黑色表示结点未访问,白色表示结点已访问,虚线边表示当前遍历路径访问V0 ,发现从V0 出发可以到达两个未访问顶点:V1 和V2 ,因此准备访问V1 和V2 这两个顶点。从V0 出发访问V1 ,发现从V1 出发可以到达两个未访问顶点:V3 和V4 ,因此准备访问V3和V4这两个顶点。从V1出发访问V3,但是从V3出发不能到达任何未访问顶点,因此退原创 2021-01-21 15:09:28 · 172 阅读 · 0 评论 -
图的存储
邻接矩阵设图G(V, E)的顶点标号为0, 1,…, N-1,那么可以令二维数组G[N][N]的两维分别表示图的顶点标号,即如果G[i][j]为1,则说明顶点 i 和顶点 j 之间有边;如果G[i][j]为0,则说明顶点 i 和顶点 j 之间不存在边,而这个二维数组G[][]则被称为邻接矩阵。如果存在边权,则可以令G[i][j]存放边权,对不存在的边可以设边权为0、-1或是一个很大的数。邻接表设图G(V, E)的顶点标号为0, 1,…, N-1,每个顶点都可能有若干条出边,如果把同一个顶点的所有出原创 2021-01-20 18:47:46 · 93 阅读 · 0 评论 -
图的定义和相关术语
图图:由顶点(Vertex)和边(Edge)组成,每条边的两端都必须是图的两个顶点(可以是相同的顶点)。而记号G(V, E)表示图G的顶点集V、边集为E。有向图:所有的边都有方向,确定了顶点到顶点的一个指向无向图:所有的边都是双向,无向边所连接的两个顶点可以相互到达顶点的度:指和该顶点相连的边的条数。出度:对于有向图,顶点的出边条数。入度:对于有向图,顶点的入边条数。权值:顶点和边都可以有一定属性,而量化的属性称为权值。点权:顶点的权值。边权:边的权值。...原创 2021-01-20 17:15:24 · 143 阅读 · 0 评论 -
广度优先搜索(BFS)
广度优先搜索广度优先搜索:当碰到岔道口时,总是先依次访问从该岔道口能直接到达的所有结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,以此类推,直到所有结点都被访问为止。广度优先搜索(BFS)一般由队列实现,且总是按层次的顺序进行遍历。定义队列q,并将起点s入队写一个while循环,循环条件时队列q非空在while循环中,先取出队首元素top,然后访问它(访问可以时任何事情,例如将其输出)。访问完后将其出队将top的下一层结点中所有未曾入队的结点入队,并标记它们的层号为now原创 2021-01-20 16:52:19 · 137 阅读 · 0 评论 -
深度优先搜索(DFS)
深度优先搜索深度优先搜索:从起点开始,当碰到岔道口时,总是选择其中一条岔路前进,在岔路上如果又遇到新的岔道口,仍然选择新岔道口的其中一条岔路前进,直到碰到死胡同才回退到最近的岔道口选择另一条岔路。(不碰到死胡同就不回头)深度优先搜索是一种枚举所有完整路径以遍历所有清空的搜索方法。使用递归可以很好地实现深度优先搜索,系统会调用一个叫系统栈的东西来存放递归中每一层的状态,因此使用递归来实现DFS的本质还是栈。例题有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干物件放入一个容量为V原创 2021-01-20 14:46:18 · 84 阅读 · 0 评论 -
链表处理
链表概念链表:由若干个结点组成(每个结点代表一个元素),且结点在内存中的存储位置通常是不连续的。链表的两个结点之间一般通过一个指针来从一个结点指向另一个结点。struct node{ typename data; //数据域 node* data; //指针域}数据域:存放结点要存储的数据指针域:指向下一个结点的地址创建链表#include <stdio.h>#include <stdlib.h>//链表结点struct node{ int data;原创 2021-01-19 17:44:43 · 403 阅读 · 0 评论 -
队列的应用
队列的应用队列:先进先出的数据结构一个队首指针front来指向队首元素的前一个位置一个队尾指针rear来指向队尾元素使用数组来实现队列时,队首指针front和队尾指针rear为int型变量使用链表来实现队列时,为int*型变量的指针清空初始状态为front=-1、rear=-1void clear(){ front = rear = -1;}获取队列内元素的个数rear- front为队列元素的个数int size(){ return rear - front;}判空原创 2021-01-19 17:16:18 · 217 阅读 · 0 评论 -
栈的应用
栈的应用1)栈(stack):是一种后进先出的数据结构.2)栈顶指针:始终指向栈的最上方元素的一个标记,当使用数组实现栈时,栈顶指针是一个int型的变量,通常记为TOP;当使用链表实现时,是一个int*型的指针。3)栈空:栈中没有元素,TOP为-1清空将栈顶指针TOP置为-1,表示栈中没有元素。void clear(){ TOP = -1;}获取栈内元素个数由于栈顶指针TOP始终指向栈顶元素,而数组下标从0开始,因此栈内元素的数为TOP+1。int size(){ return原创 2021-01-19 17:00:38 · 144 阅读 · 2 评论 -
堆
堆的定义与基本操作堆:一棵完全二叉树,树中的每个结点的值都不小于(或不大于)其左右孩子结点的值。大顶堆:父亲结点的值大于或等于孩子结点的值,即每个结点的值都以它为根结点的子树的最大值。小顶堆:父亲结点的值小于或等于孩子结点的值,即每个结点的值都以它为根结点的子树的最小值。堆建立堆是一棵完全二叉树,可以用数组来存储完全二叉树,第一个结点将存储于数组中的1号位,并且数组i号位表示的结点的左孩子就是2i号位,而右孩子则是2i+1位。const int maxn = 100;//heap为堆,n为元素原创 2021-01-18 13:56:01 · 81 阅读 · 0 评论 -
并查集
并查集的定义并查集:一种维护集合的数据结构,合并(Union),查找(Find),集合(Set)合并:合并两个集合查找:判断两个元素是否在一个集合并查集实现——用一个数组int father[N};father[i]表示元素i的父亲结点,而父亲结点也是这个集合的元素(1<=i<=N)。father[i]=i:元素i是该集合的根结点同一集合来说只存在一个根结点,且将其作为所属集合的标识father[1] = 1; //1的父亲结点是自己,即根结点father[2] =原创 2021-01-15 11:19:39 · 2017 阅读 · 4 评论 -
平衡二叉树
平衡二叉树的定义平衡二叉树:AVL,其左子树与右子树的高度之差的绝对值不超过1,其中左子树与右子树的高度之差称为该结点的平衡因子。struct node{ int v, height; //v为结点权值,height为当前子树高度 node *lchild, *rchild; //左右孩子结点地址};新建结点//生成一个新结点,v为结点权值node* newNode(int v){ node* Node = new node; //申请一个node型变量的地址空间原创 2021-01-14 16:35:12 · 150 阅读 · 0 评论 -
二叉查找树
二叉查找树的定义二叉查找树:要么二叉查找树是一棵空树要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根结点的数据域。二叉查找树的基本操作1.查找操作3. 如果当前根结点root为空,说明查找失败,返回4. 如果需要查找的值x等于当前根结点的数据域root->data,说明查找成功,访问之。5. 如果需要查找的值x小于当前根结点的数据域root->data,说明应原创 2021-01-13 10:30:57 · 103 阅读 · 0 评论 -
树的遍历
树的静态写法用数组下标代替所谓的地址struct node{ typename data; //数据域 int child[maxn]; //指针域,存放所有子结点的下标}Node[maxn]; //结点数组,maxn为结点上限个数当无法预知子结点个数时,可以使用vetctorstruct node{ typename data; //数据域 vector child[maxn]; //指针域,存放所有子结点的下标}Node[maxn]; //结点数组,maxn原创 2021-01-12 18:59:07 · 100 阅读 · 0 评论 -
二叉树的遍历
先序遍历先序遍历的实现先序遍历:根结点->左子树->右子树void preorder(node* root){ if(root == NULL) { return; //到达空树,递归边界 } //访问根结点root,例如将其数据域输出 printf("%d\n", root->data); //访问左子树 preorder(root->lchild); //访问右子树 preord.原创 2021-01-07 19:12:37 · 140 阅读 · 0 评论 -
树与二叉树
树的定义与性质树:在数据结构中,树是用来概括这种传递关系的一种数据结构。结点:数据结构中把树枝分叉处、树叶、树根抽象为结点。根结点:树根叶子结点:树叶边:茎干和树枝一棵树最多存在一个根节点叶子结点不再延伸出新的结点一条边只用来连接两个结点(一个端点一个)树:由若干个结点和若干个边组成的数据结构,且在树中的结点不能被边连成环。树的性质:树可以没有结点,即空树树的层次:从根结点开始算起,根结点为第一层,根结点子树的根结点为第二次…度:结点的子树棵数树的度:树中结点的最大的度由于原创 2021-01-05 19:01:58 · 568 阅读 · 0 评论 -
memset
memsetmemset:对数组中每一个元素赋相同的值memset(数组名, 值, sizeof(数组名));在头文件添加#include <string.h>只建议初学者使用memset赋0或-1,memset使用的是按字节赋值,对每个字节赋同样的值,这样组成的int型的4个字节就会被赋成相同值,0的补码是0,-1的补码是1,如果对其它数字赋值,使用fill函数#include <stdio.h>#include <string.h>int main()原创 2020-12-22 17:02:32 · 116 阅读 · 0 评论