数据结构
文章平均质量分 66
five-five
学习吧
展开
-
数据结构与算法之Floyd算法-最短路径问题
# Floyd算法-最短路径问题# 算法结束Floyd算法:求出每一对顶点之间的最短路径**核心**:使用动态规划思想,将问题的求解分为多个阶段:对于n个顶点的图G,求任意一对顶点V_i->V_j之间的最短路径可分为如下几个阶段:* 初始:不允许在其他顶点中转,最短路径是?* 0:若允许在$V_0$中转,最短路径是?* 1:若允许在$V_0,V_1$中转,最短路径是?* 2:若允许在$V_0,V_1,V_2$中转,最短路径是?* ...* n-1:若允许在$V_0,V_1,V_原创 2023-09-17 19:50:41 · 235 阅读 · 0 评论 -
数据结构与算法之删除以x为值的节点的子树
已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。原创 2022-09-17 10:53:49 · 1377 阅读 · 0 评论 -
数据结构与算法之构建二叉搜索树
定义:遍历二叉树是以一定的跪着将二叉树中的结点排列成有一个线形序列,从而得到几种遍历序列,使得该序列中的每个结点(第一个和最后一个节点除外)都有一个直接前驱和直接后继。直接前驱和直接后驱使按照遍历序列的顺序来的(不是逻辑上的左右子树或父子关系)。规定:若无左子树,令lchild指向其前驱结点;若无右子树,令rchild指向其后继节点。原创 2022-09-17 10:52:12 · 786 阅读 · 0 评论 -
数据结构与算法之对于递归的理解
为什么 function 需要 call 自己?因为大问题(Big problem)可以分解成小问题(sub problems).小问题通常很容易解答!例如:跑步 10km 很难,但是跑步 10km =跑步 9km+ 先跑 1km,后者不再是一个艰难的任递归是一种非常直观的解决复杂问题的方法。(重点就在于你怎么去把这个问题抽象出简单的几步)递归分两步:Base Case+Recursion Relation。原创 2022-09-17 10:50:30 · 234 阅读 · 0 评论 -
数据结构与算法之交换二叉树左右子树
# 题目![image](assets/image-20220913103238-m8nudwk.png)# 思想递归交换即可,前/中/后序皆可# 代码实现## 简洁版```javapublic TreeNode swapLeftAndRightNode(TreeNode root) { if(root!=null){ swapLeftAndRightNode(root.left); swapLeftAndRightNode(root.rig原创 2022-09-17 10:44:23 · 208 阅读 · 0 评论 -
数据结构与算法之从前序与中序遍历序列构造二叉树
## 试题部分### 做表法【做完之后一定要验证】主要内容就是使用**做表法**来快速确定二叉树的结构,这里贴上up主原视频链接:> [无脑秒解!已知先/后序遍历与中序遍历,求后/先序遍历。_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1Xu411d7qf)#### 原则:1. 两个序列中必须含有**中序遍历序列**才能确定唯一的二叉树序列2. 在表格中: 1. **中序遍历序列**表示表格的**行表头**(首行)原创 2022-09-17 10:41:14 · 909 阅读 · 0 评论 -
数据结构与算法之二叉树的最大宽度(增强版)
BFS+编号(满二叉树性质)原创 2022-09-15 11:24:00 · 137 阅读 · 0 评论 -
数据结构与算法之层次遍历算法
这个题目其实就是考察BFS求最短路径问题,🤣写这篇文章的时候还不会这招。(即逐层地,从左到右访问所有节点)。原创 2022-09-14 17:31:44 · 142 阅读 · 0 评论 -
数据结构与算法之非递归遍历二叉树
第一种思路:对于任一结点 P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还未被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题。原创 2022-09-14 17:20:30 · 243 阅读 · 0 评论 -
数据结构与算法之链表结构寻找p、q最近的公共祖先
这道题的目的:**了解后序遍历的特性(在遍历中,栈内元素都是当前元素的直系祖先)**学明白了这一点,就是你做这道题最大的收获。, ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写算法。,该算法找到p和q的最近公共祖先结点r。设一棵二叉树的结点结构为。原创 2022-09-14 17:16:57 · 605 阅读 · 0 评论 -
数据结构与算法之奇偶链表
# 奇偶链表## 题目>原题:[328. 奇偶链表 - 力扣(LeetCode)](https://leetcode.cn/problems/odd-even-linked-list/)给定单链表的头节点head,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数,第二个节点的索引为偶数,以此类推。![](../../assets/Pasted%20image%2020220815112247.png)## 想法双指针法 (...原创 2022-08-17 09:27:02 · 305 阅读 · 0 评论 -
数据结构与算法之合并两个有序链表
# 合并两个有序链表## 题目![](../../assets/Pasted%20image%2020220816092428.png)## 想法使用头插法合并## 代码```Cvoid mergeSortedList(LinkedList l1, LinkedList l2) { LNode *l1Head = l1; LNode *l2Head = l2; LNode *mergedList = (LNode *) malloc(sizeof(LN原创 2022-08-17 09:25:46 · 317 阅读 · 0 评论 -
数据结构与算法之两个有序链表的重复项
# 两个有序链表的重复## 题目![](../../assets/Pasted%20image%2020220817092044.png)## 想法1. 设两个链表分别为 `a`,`b`,新增链表为 `m` 令 `m` 链表初始 `data` 值为 `9999`[^1],令 `a.data` 和 `b.data` 进行比较 1. 当 `a.data==b.data`,令 `m.next=a;a=a.next;b=b.next;c=c.next`. 2. 当 `a.data>b.data`,令原创 2022-08-17 09:22:26 · 273 阅读 · 0 评论 -
数据结构与算法之希尔排序
时间复杂度:和增量序列的选择有关,⽬前⽆法⽤数学⼿段证明确切的时间复杂度。最坏时间复杂度为O(n2)O(n^2)O(n2),当 n 在某个范围内时,可达O(n1.3)O(n^{1.3})O(n1.3)稳定性:不稳定适用性:仅适⽤于顺序表,不适⽤于链表。...原创 2022-08-05 11:52:56 · 146 阅读 · 0 评论 -
数据结构与算法之插入排序
每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成排序(冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,基数排序) - VisuAlgo折半插入排序在观看本段内容时,需要 二分查找法 相结合,折半查找关键代码如下折半插入排序代码如下:拓展:带哨兵的插入排序原理其实大同小异,这里就不过分说明。...原创 2022-08-05 10:26:12 · 96 阅读 · 0 评论 -
数据结构与算法之二分查找法【简洁版】
数组项后移推荐从逆序遍历,从数组最后一个元素开始位移,[前移则从0开始]原创 2022-07-20 14:39:40 · 134 阅读 · 0 评论 -
数据结构与算法之最短路径-Floyd算法
Floyd:求出每一对顶点之间的最短路径使用动态规划思想,将问题的求解分为多个阶段对于 n 个顶点的图 G,求任意一对顶点 ViV_iVi➡️VjV_jVj之间的最短路径可分为如下几个阶段: ^dc1a52Floyd实现...原创 2022-06-20 15:59:05 · 344 阅读 · 0 评论 -
数据结构与算法之最短路径-BFS算法
# 最短路径问题提出“G 港”是个物流集散中心,经常需要往各个城市运东西,怎么运送距离最近?——单源最短路径问题![](https://pic-space-1303847498.cos.ap-guangzhou.myqcloud.com/img/20220616161900.png)假如再加一点:各个城市之间也需要互相往来,相互之间怎么走距离最近?——每对顶点间的最短路径**最短路径问题**1. 单源最短路径 1. BFS 算法 (无权图) 2. Dijkstra 算法 (带权图、无权图)原创 2022-06-20 14:57:12 · 459 阅读 · 0 评论 -
数据结构与算法之最短路径-Dijkstra算法
接上文的 最短路径-BFS算法带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度之和。最短路径问题首先观看如下两副图:初试:v0v_0v0到 v2v_2v2的最短 (带权) 路径长度为:通过 可知,v_0 到 v_2 的最短 (带权) 路径:v2v_2v2...原创 2022-06-20 14:55:50 · 375 阅读 · 0 评论 -
数据结构与算法之最小生成树
连通图的生成树是包含图中全部顶点的一个极小连通子图。若图中顶点数为 n,则它的生成树含有 n−1n-1n−1条边。对于生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。如下图,思考:道路规划要求:所有地方都连通,且成本尽可能的低下面是提供的两种方案,看图:此处引出最小生成树的概念,又称为最小代价树。对于一个带权连通无向图 G=(V,E)G=(V,E)G=(V,E),生成树不同,每颗树的权 (即树中所有边上的权值之和) 也可能不同。设 R 为 G 的所有生成树的集合,若 T 为原创 2022-06-16 16:39:07 · 1020 阅读 · 0 评论 -
数据结构与算法之图的深度优先遍历(DFS)
学习图的深度优先遍历 (DFS),先复习下 树的深度优先遍历(这里以先根遍历为例)。这里的 和 同上文 方法说明注意:树节点示意图生成树示意图同 广度优先生成森林 一样有向图&强连通图原创 2022-06-16 16:33:55 · 1515 阅读 · 3 评论 -
数据结构与算法之图的广度优先遍历
在学习图的广度优先算法时,需要先学习树的广度优先遍历 (层序遍历,树是一种特殊的图)5.6 二叉树的层序遍历^a54835算法存在的问题改进代码如下:算法复杂度分析原理同 代码实现图广度优先遍历 相类似。广度优先生成树有广度优先遍历过程确定。由于邻接表的表示方式不唯一,因此基于邻接表的广度优先生成树不唯一。对非连通图的广度优先遍历,可得到广度优先生成森林思考:......原创 2022-06-14 21:22:36 · 3830 阅读 · 0 评论 -
数据结构与算法之十字链表&邻接多重表
> 图有以下四种存储方式> 1. 邻接矩阵:数组实现的顺序存储,空间复杂度高,不适合存储稀疏图> 2. 邻接表:顺序 + 链式存储> 3. 十字链表:存储有向图> 4. 邻接多重表:存储无向图# 十字链表存储有向图![](https://pic-space-1303847498.cos.ap-guangzhou.myqcloud.com/img/20220612165953.png)1. 空间复杂度:$O(|V|+|E|)$2. 如何找到指定顶点的所有出边:顺着绿色线路找3. 如何找到原创 2022-06-12 17:55:39 · 317 阅读 · 0 评论 -
数据结构与算法之图的存储-邻接表法
# 邻接表法 (顺序 + 链式存储)> 图有以下四种存储方式> 1. 邻接矩阵:数组实现的顺序存储,空间复杂度高,不适合存储稀疏图> 2. 邻接表:顺序 + 链式存储> 3. 十字链表:存储有向图> 4. 邻接多重表:存储无向图## 结构 (顺序 + 链式存储)![](https://pic-space-1303847498.cos.ap-guangzhou.myqcloud.com/img/20220612163615.png)``` C//顶点typedef struct VN原创 2022-06-12 17:54:22 · 330 阅读 · 0 评论 -
数据结构与算法之矩阵的压缩存储
M 行 N 列的二维数组 b[M][N] 中,若按照行优先存储,则 的存储地址=可用二维数组存储注意:描述矩阵元素时,行、列号通常从 1 开始;而描述数组时通常下标从 0 开始(具体看题目给出的条件,注意审题!)分类:稀疏矩阵方阵:某些特殊矩阵可以压缩存储空间定义:若 n 阶方阵中任意一个元素 a[i][j]=a[j][i],则该矩阵称为对称矩阵普通存储:n*n 二维数组压缩存储策略:只存储主对角线 + 下三角区 以 该策略 为例,按行优先原则将各元素存入一维数组中。等差数列公式: ^7kygmb可以实原创 2022-06-12 12:36:52 · 5424 阅读 · 2 评论 -
数据结构与算法之图
图 G 由顶点集 V 和边集 E 组成,记为 G=(V,E),其中若 E 是无向边 (简称边) 的有限集合时,则图 G 为无向图。边是顶点的无序对,记为 (v,w) 或 (w,v),因为 (v,w)=(w,v),其中 v、w 是顶点。可以说顶点 w 和顶点 v 互为邻接点。边 (v,w) 依附于顶点 w 和 v,或者说边 (v,w) 和顶点 v、w 相关联。G2=(V2,E2)G_2=(V_2,E_2)G2=(V2,E2)V2=A,B,C,D,EV_2={A,B,C,D,E}V2=A,B,C,D原创 2022-06-12 12:34:40 · 188 阅读 · 0 评论 -
数据结构与算法之哈夫曼树
在含有 n 个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树给定 n 个权值分别为 w1w_1w1,w2w_2w2,…,wnw_nwn的结点,构造哈夫曼树的算法描述如下:视频链接如下:https://www.bilibili.com/video/BV1wX4y1M7TG?spm_id_from=…search-card.all.click电报——点、划两个信号 (二进制 0/1)固定长度编码——每个字符用相同长度的二进制位表示ASCII 编码每个字符用原创 2022-06-10 09:41:37 · 940 阅读 · 0 评论 -
数据结构与算法之二叉排序树
二叉排序树,又称二叉查找树 (BST)一颗二叉树或者空二叉树,或者是具有如下性质的二叉树:左子树结点值原创 2022-06-05 16:40:22 · 1148 阅读 · 0 评论 -
数据结构与算法之平衡二叉树(AVL)的插入、旋转以及遍历
平衡二叉树 (AVL,Balanced Binary Tree),简称平衡树 (AVL 树)-- 树上任一结点的左子树和右子树的高度之差不超过 1。平衡二叉树的插入假定有如下子树,{A}、{B}、{AR}、{BL}、{BR},且假定所有子树的高度为 H(或者你认为是 1 也可以)。如下图即:A 的平衡粒子为 1,B 为 0,AR 无子树现在:以 LL(左孩子的左子树) 插入,操作如下图:此时:B 的子树高度为 H+1(已做 LL 操作),AR 不变,那 A 的平衡因子为 2 了。此时就成 A原创 2022-06-05 16:34:08 · 733 阅读 · 0 评论 -
数据结构与算法之树与森林的遍历
树是n(n≥0)个结点的有效集合,n=0时,称为空树,这是一种特殊情况。在任意一颗非空树中应该满足:5.6 二叉树的层序遍历先序遍历森林:若森林为非空,则按如下规则进行遍历:若森林为非空,则按如下规则进行遍历:原创 2022-06-02 17:22:10 · 801 阅读 · 0 评论 -
数据结构与算法之从前序与中序遍历序列构造二叉树
通过前序遍历+中序遍历来构造二叉树视频讲解:这里引用leetcode官方简介视频[从前序与中序遍历序列构造二叉树 - 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode).ts](assets/从前序与中序遍历序列构造二叉树 - 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)-20220602150410-cot75wo.ts)原创 2022-06-02 16:58:03 · 211 阅读 · 0 评论 -
数据结构与算法之二叉树的线索化
# 两种方式(这里主要讲述[中序线索化](siyuan://blocks/20220601153100-jho8aog))## 用土办法找到中序前驱(暴力)```cvoid InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild);//递归遍历左子树 visit(T); InOrder(T->rchild);//递归遍历右子树 }}void visit(BiTNode *q){ if(q==p){ final = pre;//找原创 2022-06-01 17:02:39 · 75 阅读 · 0 评论 -
数据结构与算法之线索二叉树
二叉树的中序遍历序列:D G B E A F C思路:从根节点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针记录上一次访问的结点。当时,为前驱缺点:找前驱、后继很不方便,遍历操作必须从根出发,此时这种场景就需要考虑中序线索二叉树了先看图,在看代码线索二叉树节点对应tag位为0时,表示指针指向其他孩子对应tag位为1时,表示指针是线索具体细节参考中序线索二叉树具体细节参照中序线索二叉树原创 2022-06-01 17:01:02 · 211 阅读 · 0 评论 -
数据结构与算法之遍历序列来构造二叉树
中序遍历:中序遍历左子树、根节点、中序遍历右子树前序遍历序列:中序遍历序列:给出下列两种遍历序列,分别是:这里要用的概念:因此结合两种序列串和前序遍历以及中序遍历的概念,我们可以推出:趁热打铁,我们在来一个稍微复杂的这里要用的概念:因此结合两种序列串和前序遍历以及中序遍历的概念,我们可以推出:D为根节点(root),EAF是D的左子树,A是EAF这棵树的根节点,E、F分别是A节点的左、右子树;此时DAEF都已确定,则:B为根节点,后序遍历序列:中序遍历序列:层序遍历序列:中序遍历序列:原创 2022-06-01 16:58:05 · 773 阅读 · 1 评论 -
数据结构与算法之二叉树的先序、中序以及后序遍历
什么是遍历遍历:按照某种次序把所有结点 都访问一遍层次遍历:基于树的层次特性确定的次序规则先/中/后序遍历:基于树的递归特性确定的次序规则二叉树的遍历二叉树的递归特性:要么就是个空二叉树要么就是有“根节点+左子树+右子树”组成的二叉树遍历方式先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍历:左右根(LRN)下面是一些遍历方式例图先序遍历操作过程:若二叉树,则什么都不做;若二叉树非空:访问根节点先序遍历左子树先序遍历原创 2022-05-30 16:35:26 · 394 阅读 · 0 评论 -
数据结构与算法之二叉树的层序遍历
数据结构与算法之二叉树的层序遍历什么是层序遍历算法思想动图展示代码展示头文件`BiTNodeSqQueue.h``BiTNode.h`什么是层序遍历首先,看下图层序遍历结果应该是:ABCDEFGHIJKL算法思想初始化一个辅助队列根节点入队若队列非空,则队头节点出队,访问该节点,并将其左、右孩子插入队尾(如果有的话)重复3直至队列为空动图展示代码展示/** * 二叉树的层序遍历 * @param biTree 二叉树 */void levelOrder(BiTree原创 2022-05-30 16:34:42 · 153 阅读 · 0 评论 -
数据结构和算法之二叉树的顺序实现和链式实现
数据结构和算法之二叉树的顺序实现和链式实现二叉树的顺序存储二叉树的链式存储基本实现带父结点的二叉树(三叉链表)总结顺序存储链式存储二叉树的顺序存储#define MaxSize 100struct TreeNode{ ElemType value;//结点中的数据元素 bool isEmpty;//结点是否为空};TreeNode t[MaxSize];定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点初始化时所有的结点标记为空for(原创 2022-05-28 15:20:23 · 254 阅读 · 0 评论 -
数据结构和算法之二叉树以及特殊树相关概念
数据结构和算法之二叉树以及特殊树相关概念基本概念几个特殊的二叉树满二叉树特点:完全二叉树特点二叉排序树平衡二叉树基本概念二叉树是n(n>=0)个结点的有限集合:或者为空二叉树,即n=0。或者由一个根节点和两个互不相干的被称为根的左子树和右子树组成。左子树和右子树有分别是一颗二叉树注意区别:度为2的有序树几个特殊的二叉树满二叉树一颗高度为h,且含有2^h-1结点的二叉树特点:只有最后一层有叶子节点不存在度为1的结点按层序从1开始编号,结点i的左孩子为2i2i2i,右原创 2022-05-28 15:12:01 · 168 阅读 · 0 评论 -
数据结构和算法之C语言实现串
数据结构和算法之C语言实现串顺序存储顺序存储的几种方案:顺序存储顺序存储的几种方案:链式存储一个结点对应一个字符一个结点对应多个字符基本操作【基于顺序存储】顺序存储#define MAXLEN 255 //预定义最大串长为255typedef struct{ char ch[MAXLEN]; int length;}SStingtypedef struct{ char *ch; //按串的长度分配储存区,ch指向串的基地址 int length; //串的长度}HString;原创 2022-05-26 10:45:17 · 346 阅读 · 0 评论 -
数据结构与算法之使用栈实现中缀表达式转后缀表达式
思路中缀表达式转后缀表达式手算方法:确定中缀表达式中各个运算符的运算顺序选择下一个运算符,按照[左操作数 右操作数 运算符]的方式组合成一个新的操作数如果还有运算符没被处理,就继续2左优先原则:只要左边的运算符能先计算,就优先算左边的(可以保证运算顺序唯一)最后出现的操作数先被运算机算方法:初始化一个栈,用于保存暂时还不能确定运算顺序的运算符从左到右处理各个元素,直到末尾。可能遇到三种情况:遇到操作数。直接加入后缀表达式。遇到界限符。遇到"(“直接入栈;遇到”)“则依原创 2022-05-23 16:28:24 · 1084 阅读 · 0 评论