自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法中常用的图的存储结构笔记(含完整代码实现)

邻接表本身就是结构体数组,first成员后面挂了出边结点的编号,实际上也是可以再开辟一个维度的数组来存储的。那么对于这个二维数组,如果有权的话每个元素也是一个结构体(无权图的话是int类型的二维数组)同起点的边我能通过next找到联系起来,我再搞一个一维数组来记录不同起点的第一个出边的位置。to:同起点的边的终点下标 w:权值 next:同起点下一条边的位置。即二维数组存储图(不等于邻接矩阵) 每一行代表编号为i的点的邻接点的编号是j。//一维为编号x的邻接点的编号。如果有问题还请指出!

2026-04-04 21:51:23 437

原创 图的搜索笔记(含完整代码实现)

图的DFS--->树 深度遍历--> 递归 主要原因还是每个步骤的执行逻辑是相同的。起点是第一层,起点的邻接点都是第二层,邻接点的邻接点都是第三层…先访问起点v,有v出发,访问v的一个还未被访问的邻接点w 访问w。再从w1出发,访问w1的一个还未被访问的邻接点w2,访问w2……广度优先遍历BFS ---->也可用于求解无权图的单源最短路径。再从w出发,访问w的一个还未被访问的邻接点w1,访问w1。以此类推,直到一个点没有了未被访问过的邻接点时,就回退。BFS--->树 层次遍历-- >队列。

2026-04-01 21:57:53 118

原创 图的存储结构总结笔记(含完整代码)

带权有向图: e[i] [j] =w 存在i--->j的边权值是w e[i] [j] =无穷大 不存在i--->j的边。为了实现用顶点来说明边,做出规定 e[i] [j] i------>j e[j] [i] j----->i。无权有向图: e[i] [j] =1 存在i--->j的边 e[i] [j] =0 不存在i--->j的边。1.边集数组(e)存图-----最简单------应用场景:需要对边按照边权排序。带权无向图: i----j w,e[i] [j]=e[j] [i]=w。

2026-03-23 23:00:14 550

原创 图的概念笔记

2.子图:要求G‘=(V',E')其中V'属于V , E'属于E, 并且V'只能是E’的顶点偶对,不能连到不属于V的边。n个顶点连通,最少边为n-1(就是树型结构,所以极小连通子图也叫生成树) 无向边概念。一个图一定不能没有顶点。一个有向图所有点的度一定是偶数, 如果该图有e条边 值一定是2e(入+出)有n个点的无向图:在保证是简单图的前提下,最多n*(n-1)/2条边。1.端点:一条边连接的两点 邻接点:同一条边连接的两个点互为邻接点。有n个点的有向图:在保证是简单图的前提下,最多n*(n-1)条边。

2026-03-20 21:00:00 277

原创 二叉平衡树学习笔记(含完整代码实现)

情况一LL:在结点x的左孩子的左子树中插入一个结点,导致x成为最小失衡子树的根节点,此时之要将x右旋即可。情况三RR:在结点x的右孩子的右子树中插入一个结点,导致x成为最小失衡子树的根节点,此时之要将x左旋即可。情况二LR:在结点x的左孩子的右子树中插入一个结点,导致x成为最小失衡子树的根节点,此时需要。情况四RL:在结点x的右孩子的左子树中插入一个结点,导致x成为最小失衡子树的根节点,此时需要。2,递归过程中,当下层递归调用结束时,返回到本层时,算一下本层递归的根节点的平衡因子,

2026-03-16 22:11:53 622

原创 哈夫曼编码学习笔记(含完整代码实现)

2.具体来说合并:每次把两棵树合并成一棵树,让两个树的根节点来做兄弟,给他们添加一个父亲结点 (也就是新树的根节点) 所以总结点数为n+(n-1)要求n个节点都只能做叶子节点(规定,所以不能直接连接这两个结点),叶子节点也只能有这n个结点--->还额外需要n-1个结点。(现在有n棵树,要只合成一棵树,每合并一次,就少一棵树,所以合并n-1次,也就还额外需要n-1个“根”节点)3(pow(2,3)>5)大权值-->短路径--->距离根节点近 小权值--->长路径--->距离根节点远。..---->共36位。

2026-03-14 23:51:10 485

原创 并查集笔记(含完整代码实现)

想法二:链表 理由:合并快,两个链表首尾相接即可合并 但是缺点:查找慢,必须从头到尾查找 查找效率是n。正解:普通的树形结构 (1)合并:把两个树的根节点连在一起,一棵树的根节点去做另一棵树的根节点的孩子。如果两棵树的根节点相同,在同一棵树中。(2)查询 :两个数据在不在同一棵树中,分别找到两个结点的根节点即可。2:2和0 no 2:9和6 yes 1:2和19 A和C合并。2.给出两个数据x,y,查询这两个数据是否总在同一个集合中。1.给出两个数据x,y,把x所在的集合与y所在的集合合并。

2026-02-23 22:22:52 50

原创 二叉排序(搜索)树算法(含代码实现)

eg.删除结点20:(1)将20的前驱15赋值给20,(2)问题转换为删除度为1的结点15,并用他的孩子来顶替。(2)删除度为1的结点:找到该节点p,把p删除,用唯一存在的孩子(子树的根节点)顶替p的位置---基于递归。(1)删除度为0的结点:找到该节点P,把P删除,20赋空(认为要用p的其中一个NULL孩子代替p的位置)如果建树的n个数据本身是有序的,建立的BST是一棵斜树,此时树的高度是n,起不到加快数据查找的作用。即:每个"根"结点的所有左子树数据小于根节点的数据,所有右子树数据大于根节点的数据。

2026-02-13 23:18:38 715

原创 二叉树优先深度遍历和线索化笔记(含代码实现)

出于把父节点放在最后打印的特点: 入栈,没有左孩子了,返回时只get栈顶不出栈,左右都访问完了过后出栈返回并访问 也就是说一个父节点会被经过3次,第一个入栈,第二次get,第三次出栈访问。正在访问的结点同时也是上一个结点的后继,所以我要还要给上一个访问的结点添加后继线索,再将pre移动。否则,如果k的右孩子为空或pre==k→right,说明右子树被遍历完了,直接访问k,1)引1入一个指针p帮助我们进行遍历,p指向将要遍历的结点,初始时 p=root。2)如果还有未被遍历到的结点,继续遍历:如果p!

2026-02-10 22:10:51 786

原创 二叉树的遍历笔记(含完整代码实现)

算法:构造一个队列,因为结点的访问满足先进先出的原则,(即能够利用队列提前记录下我后续要访问的结点,先入队的先访问)二叉树的遍历:沿着某条搜索路径,把树中的每个数据(结点)访问仅且一次 访问(输出)左中右 以a为根 b a c 以b为根 d b e 以e为根 f e g。(1)层次遍历(广度遍历) 二叉链表存储,一开始只知道根节点指针。即顺序 根-(左根(左左)(左右)) (右根(右左) (右右))根(左根(左左) (左右) (右根(右左)(右右))(2)深度遍历: 根节点 左子树 右子树。

2026-01-25 21:33:55 348

原创 二叉树及其存储方式学习笔记(含完整代码实现)

满二叉树:(1)除了叶结点,其他结点均有两个孩子结点的树,并且所有的叶子节点都在同一层 判断方法:是否是2^k-1。*结论4:具有n个结点的完全二叉树,其树的高度/深度/层数是([log2为底n的对数]+1))//向上取整(粗略)又(2)B=n2*2+n1*1 *(3结论)B=n-1(从下往上看,把结点和边看为整体,只有根节点1没有边)(1)如果i=1,是根节点 (2)双亲的编号为i/2 (3)左孩子为i*2,右孩子为i*2+1。结论1:第i层最多有2^(i-1)个结点, 最少有1个结点。

2026-01-21 23:33:00 390

原创 树和树的三种表示方法(含完整代码实现)

因为每个父亲可能有多个孩子,也可能有一个,也可能没有,像上图用数组存储的话每个数组都需要开辟n个空间。(3)孩子兄弟表示法:说清楚每个结点的孩子和他的兄弟都有谁----基于递归(二叉链表表示法)存孩子关系(可能有多个):n个同类型数据可以用数组--但是浪费空间 链表。(1)双亲表示法:说清楚每个结点的父亲(代码已实现,案例如下图)这个结构体存了数据,指针(指针把链表连接起来,类型是节点类型)定义:用于存储一对多关系的有限的数据集合(非线性结构)(2)孩子表示法:说清楚每个结点的孩子。使用结构体数组即可。

2026-01-20 09:35:30 152

原创 单端队列笔记及代码实现(数据结构)

只允许在一段进行插入操作,在另一端进行删除操作,中间位置不能操作(不能插队),构成了队列。//只允许在一端进行插入操作和删除操作,中间位置不允许操作,另一端也不允许操作构成了栈。(2)1.(1)初始化int f=0,int r=-1;但r指向的不是真正的队尾,而是队尾得下一个位置,也就是说r在入队之后向后移。1.(1)初始化int f=0,int r=0;基于链式存储结构实现的队列---链式队列---带头结点的单链表。f==r&&size==maxsize 则认为满了。

2026-01-19 23:26:43 261

原创 栈笔记及代码实现(数据结构)

(1)函数的实现基于栈的(递归) eg.main()函数里有insert()函数,insert()里有find() ,find()先返回然后insert,main。基于顺序存储结构实现的栈:顺序栈----数组 int data[maxsize] 0~maxsize-1。3.性质:先进后出---后进先出 stack(堆叠) :eg.碗的堆叠,只能从最上面开始拿走碗和放碗。基于链式存储结构实现的栈:链式栈----自带头结点的单链表。判满: top==maxsize-1 ----上溢出。

2026-01-19 23:10:41 284

空空如也

空空如也

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

TA关注的人

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