自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 线索二叉树的遍历

画之前需要知道如果缺少左边孩子需要画出它的前驱,如果缺少右边孩子的话,就需要指向它的后继,首先这里看A节点,A节点左边和右边孩子都有,所以不用画,B节点也是有左右孩子,所以也不用画,然后看C节点,它缺少左边孩子,需要找到它的前驱就是E,所以指向这个E节点,然后再去看D节点,D节点都缺少左边右边孩子,左边孩子指向前驱节点B节点,右边孩子指向后继节点E节点,再看E节点,它的前驱是D节点,它的后继是C节点,最后看F节点,它的前驱为C后继为空。这里的后序遍历为:DEBFCA。前序遍历为:ABDECF。

2024-02-22 23:11:51 253

原创 代码实现二叉树的遍历

换句话来说,就是把调用左子树的代码提前了,就是这么简单,对于中序遍历,是先遍历左子树,然后遍历根节点,最后遍历右子树。那么中序遍历算法如何进行代码书写的呢?实现遍历算法也可以采用递归思想,而且及其简单明了,以上为前序遍历代码。

2024-02-21 22:43:35 194

原创 二叉树的先序,中序,后序遍历

二叉树:前序遍历A-B-D-F-G-H-I-E-C中序遍历F-D-H-G-I-B-E-A-C后序遍历F-H-I-G-D-E-B-C-A前序(根左右),中序(左根右),后序(左右根)

2024-02-20 23:38:40 761 1

原创 dfs例题

好了,这道题在此已经解决,需要注意的点就是回溯,接下来继续学习吧。

2024-02-18 23:48:20 204 1

原创 树和二叉树的知识总结

顺序存储结构:二叉树的顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在某个数组下标为i-1的分量中,然后通过一些方法确定结点在逻辑上的父子和兄弟关系。若某结点X的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点…双亲和孩子:结点的子树的根称为该节点的孩子,该节点称为孩子的双亲:如:B的双亲为A;层次:结点的层次从根开始定义起,树中任一结点的层次都等于双亲结点的层次加1。

2024-02-16 23:42:45 1261 1

原创 栈与队列简单分析

首先咱们来解释一下什么是栈和什么是队列,栈是只能在表的一端进行插入和删除操作的线性表,相当于一个容器,只能从顶部取出数据,如果想取出最底部的数据,需要进行遍历整个栈才能取出来,而且还需要为数据开辟空间,为的就是保持数据的一致性,总之就是后进先出。接下来是解释什么是队列,队列就是只能在表的一端进行插入,但是却在另一端进行删除操作的线性表,使用地址指针进行遍历,可以从头开始或者从尾部开始遍历,但不能同时进行遍历,无需开辟空间,总之先进先出,后进后出。p.empty();//返回队尾元素的值但是不删除该元素。

2024-02-14 21:46:27 198 1

原创 运用dfs深搜解决问题

【代码】运用dfs深搜解决问题。

2024-02-08 20:11:50 180

原创 并查集与背包的结合

第一行输入三个整数,n,m,w,表示有 n 朵云,m 个搭配和你现有的钱的数目。第二行至n+1 行,每行有两个整数, ci​,di​,表示第 i 朵云的价钱和价值。表示买第 ui​ 朵云就必须买第vi​ 朵云,同理,如果买第 vi​ 朵就必须买第 ui​ 朵。前两次已经说了并查集和背包的一些内容,可以去看我之前发的关于并查集和背包的文章,这里就是结合两个知识点来写题目。因为买云朵是要按照搭配一起买的,在这里就把与祖宗一样的价格和价值合在一起。这里用两个不同的数组分别记录与祖宗一样的价格和价值。

2024-02-07 23:16:54 318 1

原创 了解并查集

初始化时,我们将每个节点都视为一个独立的连通分量,因此将每个节点的父节点初始化为自己,即 fa[i] = i。这样在后续的并查集操作中,当两个节点的根节点相同时,就代表它们属于同一个连通分量。以上基本上就是大致内容,好,这里拿一个示例,洛谷p3367,题目要求如果输入z等于1,就将两个所在的集合合并,如果z等于2,就输出是否在同一个集合里面,是的就输出Y,否则输出N。首先咱们先要知道并查集是什么东西,其实 就是一种树形的数据结构,相当于树,用于处理集合的合并与查询问题。

2024-02-06 23:17:56 122 1

原创 01背包问题

dp[i][j]数组的含义表示下标0到i之间的物品任取放入容量为j的背包里面,如果不放物品i此时就是dp[i-1][j],那么如果放物品i呢?首先还是说一下dp[j]的含义,其实dp[j]与恶人dp数组一样的意思,就是容量为j的背包所容纳的最大价值为dp[j],然后就是写公式,那么不放物品i,就是dp[j],放物品i就是dp[j-weoght[i]]+value[i],代码如下:dp[j]=max(dp[j-weoght[i]]+value[i],dp[j])0-1背包就是有n种物品,每种物品只有一个。

2024-02-05 17:12:02 288 1

原创 洛谷p5635天下第一

首先这是一个多组输入,所以这里使用while循环,每次运行一次就减1,运行回合次数最多为10000,所以这里使用for循环,发现规律只要回合次数为奇数,就让x=(x+y)%p否则就让y=(x+y)%p,当回合次数超过10000,就判断x与y的关系,如果x等于0,就输出1,如果y等于0,就输出2,否则就是x和y都不为0,就输出error。第一个回合:x←(x+y) mod p。第二个回合:y←(x+y) mod p。第三个回合:x←(x+y) mod p。第四个回合:y←(x+y) mod p。

2024-02-02 22:57:03 199

原创 解析kmp算法

这里介绍一下kmp,它主要应用在字符串匹配上。就是当字符串匹配不上的时候,可以知道之前已经匹配上了的部分字符串,为的就是可以减少重复运算,减少时间复杂度。话不多说,下面举例洛谷p3375模拟kmp字符串。首先主函数输出没毛病吧,输入字符串s和子串t。调用函数在字符串s中查找子串t的出现位置,并输出结果。ne数组就是一个前缀表,用来回退的,为的就是知道当子字符串与字符串不相符的时候,从该处重新开始匹配。遍历输出子串t的ne数组。返回0,表示程序正常结束。

2024-02-01 22:07:35 640 1

原创 广度优先搜索

首先处理输入问题,而且是多组输入所以必须进行数据的清空,这里使用函数memset,但是清空数组a的初始值不能为0(代表有路障),头文件是#include<cstring>(这里是c++)如果不知道头文件直接用万能头文件#include<bits/stdc++.h>。题目要求以下2n-2行输入数据x和y,输入的次数就是秒数,可以设一个二维数组a[1005][1005],将秒数保存到二维数组a中,表示第i秒放入的路障。什么是广度优先搜索呢?就是一层一层往外搜索,这里举例洛谷路障问题,话不多说直接进入正题。

2024-01-31 16:38:58 317 1

原创 解决题目日志分析

我们应该怎么样做呢?输入这里就不多说,我们可以先a[i]为栈中的最大值,每次输入判断是否等于0或者1或者2.如果输入值等于0,那么就进行继续输入一个y值,使得t++,并且使得a[t]等于a[t-1]与输入值y的最大值;首先直接举例洛谷p1165题目说明已经在下面,需要输入n,接下来的n行输入0,x或者1,2;题目不难,主要是需要逻辑清晰,加油!

2024-01-31 00:04:29 160 1

原创 解决临时抱佛脚问题

那关键就是dfs怎么写代码,首先做出终止条件的判定,就是当步骤step等于a[n]意味着已经找完了所有的数,找出左脑和右脑的最大值,然后再将找出的这个最大值去和1200比较,为什么跟1200去比较呢?记得写return;我们可以运用递归思想,首先我们可以将左脑,右脑,需要做的步骤,做几次,传递参数给dfs这个函数,那么由题可知,有n门科目,就需要运行n次。临时抱佛脚问题就是在n门科目中完成每门科目的k个题目,并且每门科目可以同时写两道题目,求完成复习的最短时间。下面举例洛谷p2392。

2024-01-29 23:20:56 251

原创 针对洛谷的接水问题

接下来进入while死循环,每次运行一次,时间t就加1,运用for循环遍历龙头,前提判断龙头是否大于等于0,如果成立,使得此龙头所在位置的接水量减1,并且还需要判断此位置的接水量是否为0(已经接完水),如果已经接完水,就让该处龙头往后移一个,继续使得wait++,但是前提又是wait不能超过n+1,然后因为这是是死循环肯定需要判断条件,所以先判断wait是否小于等于n,直到wait大于n才能进行以下操作,就是判断所有的接水量是否为0,如果所有的接水量都为0,就结束操作,输出t。

2024-01-28 20:29:33 324

原创 解决单词方阵问题

由题目得知有八个方向需要进行判断,所以定义两个整型数组dx和dy,还定义了一个包含了yizhong的字符数组,dfs以当前位置(x,y)作为参数来判断数组a当前的字符是否为'y',然后继续遍历8个方向来寻找yizhong单词,使用d来存储方向,继续判断是否找到yizhong单词,先检查了坐标是否在数组范围内,如果该坐标不在数组范围内,d就等于-1,终止内部循环,反之如果找到了这个yizhong单词就将数组a对应的值赋值给数组ans。这段代码是一个嵌套循环,它遍历二维数组a,并对每个元素调用dfs函数。

2024-01-26 22:14:48 276 1

原创 自然数的拆分问题

当然如果n为偶数,可以拆分成n/2+n/2,如果n为奇数,那么就拆分成(n-1)/2+(n+1)/2.不断拆分,可以使用一个数组来记录拆分情况,每一个元素必须大于等于前一个元素。否则继续进行搜索,使用一个for循环,如果当前拆分出来的值比step-1还要小,直接跳过,否则继续进行拆分,并且将该大于step-1的该值放入数组step中,然后再继续递归调用dfs函数。在主函数中输入n,并且从1遍历到n/2,并且将i存入数组a的第一个位置a[0],然后调用dfs函数,开始搜索。a[step]=i;

2024-01-25 22:58:58 323

原创 解决约瑟夫问题(数组)

0,就让num2加一,如果num2等于M,那么就打印出编号num1,并且让count减一,重新开始报数num2=0,还得让该编号的数组为0表示已经出列。何为约瑟夫问题,那么我就来给大家简单介绍,约瑟夫问题就是有N个人围成一圈,从第一个开始报数,数到M个人出列,再由下一个人重新开始报数,数到M的人出列,输出依次出列的人的编号。再接下来怎么做呢,我们需要定义两个变量,变量num1用来存储编号,变量num2用来报数从1开始到M结束,另外从开始到最终结束,就需要定义一个变量count。=0)//游戏开始到结束。

2024-01-24 22:52:40 386

原创 n皇后问题

再去进行搜索,定义函数dfs(k)如果找到了合适的位置就会继续递归dfs(k+1)下一行,在dfs函数中使用for循环在当前行的不同列中放置棋子(皇后),但是前提需要先判断当前位置是否可以放置棋子(皇后)通过fun函数,如果可以放置,就使a[k][i]=1,表示这一个位置已经放置了棋子(皇后),继续递归下一行。n皇后其实就是指在一个n*n的一个棋盘放入n个棋子(皇后),但是前提条件是每行、每列有且只有一个棋子(皇后),并且每条对角线包括两天主对角线的所有平行线上至多有一个棋子(皇后)。

2024-01-24 00:29:21 321 1

原创 学习数组二分法

2.在while循环里面的if判断语句中,判断数组中间值与需要寻找的元素大小时,例如假设数组为a,if(a[mid]<目标值) 执行的代码为left=mid还是left=mid+1;1.在使用while的时候需要注意最左边的第一个元素的下标值left与最右边的最后一个元素的下标值right的关系。首先定义数组最左边第一个元素的下标为lfet,定义最右边最后一个元素的下标为right,并且定义一个int型变量mid为区间中间值的下标。以下为一个左闭右闭区间的例子。3.注意寻找的左右两边区间。

2024-01-22 23:19:52 357

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除