![](https://img-blog.csdnimg.cn/20210714205832738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 88
记录数据结构相关知识
code_peak
这个作者很懒,什么都没留下…
展开
-
红黑树的详细实现(C++)
红黑树概念(concept)树型结构主要用于搜索,一直是科学领域的重要演算法,当中探讨了树可能遇到的问题:树的成长可能偏向于一边,也就是不平衡现象。二叉树是常见且广泛使用的一种树,面临其可能退化成链表的潜藏缺点,在使用上难免让人担心其效率。此外,在一些应用上,可能不希望这样的不平衡的可能性发生。所以具有自动平衡左右数量分布效果的演算算法早在 1962 年被提出,称为 AVL 树。这种平衡成长的二叉搜索树被称为自平衡二叉搜索树。接下来,介绍同为自平衡二叉搜索树的红黑树对平衡性的要求比 AVL 树还要宽松原创 2021-10-08 00:05:59 · 6248 阅读 · 3 评论 -
AVL树的详细实现(C++)
AVL树概念前面已经介绍了二叉搜索树,但是二叉搜索树在某些情况下会出现极度不平衡,其树形结构便退化成了链表,查找效率也会下降。于是出现了 AVL 树,AVL 树保证了二叉搜索树的平衡,引入了平衡监督机制,也就是在插入结点时,树中某一部分不平衡度超过一个阈值后将出发平衡调整操作,这样便保证了树的平衡度在可接受的范围内,最大的好处就是提高了搜索的效率。AVL 树是一种平衡二叉树,其名字来源于发明者的名字(Adelson-Velskii 以及 Landis)。AVL树的递归定义如下:左右子树的高度差小于等原创 2021-10-05 00:30:19 · 4638 阅读 · 4 评论 -
二叉搜索树的详细实现(C++)
二叉搜索树概念二叉搜索树(Binary Search Tree),又称为二叉查找树。之前已经说过了二叉树的概念和实现,而二叉搜索树是一种特殊的二叉树。假设 x 为二叉树中的任意一个结点,x 结点包含包含关键字 key,结点 X 的 key 值记为 key[x],如果 y 是 x 的左子树中的一个结点,则 key[y] <= key[x];如果 y 是 x 的右子树的一个结点,则 key[y] >= key[x]。那么,这棵树就是二叉查找树,如下图所示:在二叉搜索树中:(01) 若任意节原创 2021-10-01 23:02:16 · 1280 阅读 · 1 评论 -
线索二叉树的详细实现(C++)
线索二叉树概述二叉树虽然是非线性结构,但二叉树的遍历却为二叉树的结点集导出了一个线性序列。如果我们希望很快找到某一结点的前驱或后继,但不希望每次都要对二叉树遍历一遍,这就需要把每个结点的前驱和后继信息记录下来。为了做到这一点,可在原来的二叉链表中增加一个前驱指针域(pred)和一个后继指针域(succ),分别指向该结点在某种次序下的前驱结点和后继结点,但是这种方法将会导致很多结点中有没有利用的空指针,先看下面的例子。比如:现在有一个结点数为 n 的二叉树,采用二叉链表形式存储。对于每个结点均有指向左右原创 2021-09-06 00:02:29 · 3167 阅读 · 0 评论 -
二叉树的详细实现(C++)
关于二叉树的概念,已经在树的基本概念中详细描述,这里不做过多赘述。本文将对二叉树进行详细实现,采用 C++ 语言。二叉树结点类型定义template <typename T>struct BinTreeNode{ T data; //结点中存储的数据 BinTreeNo原创 2021-09-05 17:02:17 · 9453 阅读 · 0 评论 -
树的基本概念
树型结构,不同于线性数据结构,比较适合用于描述分支结构的数据,这种数据之间可能有祖先和后代的关系。在计算机中树型结构应用非常广泛,例如在文件系统和数据库系统中,树是组织信息的重要形式之一。树的定义树是一种数据结构,是由 n(n ≥ 1)个有限节点组成的一个具有层次关系的集合。树的示意图如下:之所以被叫做树,是因为看起来像一棵倒过来的树,也就是根朝上,叶朝下。从上图中可以看出它具有如下特点:每个节点有零个或者多个子节点,树是一个递归的定义,即树的定义中又用到了树的概念。没有父节点的节点称原创 2021-09-05 16:32:53 · 1319 阅读 · 0 评论 -
图的最短路径之Floyd算法
参考:https://wangkuiwu.github.io/2013/04/15/floyd-cplusFloyd算法介绍弗洛伊德 Floyd 算法和 Dijkstra 算法一样,也是用于寻找给定的加权图中顶点间的最短路径算法。该算法名称以创始人——1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。算法思想:通过 Floyd 计算图 G=(V, E) 中各个顶点的最短路径时,需要引入一个矩阵 S,矩阵 S 中的元素 a[i][j] 表示顶点 i(第 i 个顶点)到顶点 j(第转载 2021-08-13 22:41:09 · 450 阅读 · 1 评论 -
图的最短路径之Dijkstra算法
参考:https://wangkuiwu.github.io/2013/04/14/dijkstra-cplusDijkstra算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。算法基本思想:通过 Dijkstra 计算图 G 中的最短路径时,需要指定起点 s(即从顶点 s 开始计算)。此外,还需要引进两个集合 S 和 U。S 的作用是记录已求出最短路径的顶点(以及转载 2021-08-08 21:19:46 · 661 阅读 · 0 评论 -
图的最小生成树之Kruskal算法
参考:https://wangkuiwu.github.io/2013/04/12/kruskal-cplusKruskal算法介绍克鲁斯卡尔(Kruskal)算法,和普利姆(Prim)算法类似,也是用来求加权连通图的最小生成树的算法。关于最小生成树的概念,已经在之前的图的最小生成树之Prim算法篇首介绍过。Kruskal 与 Prim 算法思想出发点不同,Prim 算法是以顶点出发的,而 Kruskal 算法是以边出发的。其算法思想是:按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条转载 2021-08-08 21:06:16 · 869 阅读 · 1 评论 -
图的最小生成树之Prim算法
参考:https://wangkuiwu.github.io/2013/04/13/prim-cplusPrim算法介绍在介绍普里姆 Prim 算法前,首先需要知道 Prim 算法的作用。Prim 算法是用来求加权连通图的最小生成树的算法。下面先介绍最小生成树。最小生成树概念在含有 n 个顶点的连通图中选择 n -1 条边,构成一棵极小连通子图,并使该连通子图中 n -1 条边上权值之和达到最小,则称其为连通图的最小生成树。图 G4如上连通图 G4 所示,可以有多棵权值总和不相同的生成树。情转载 2021-08-08 20:51:53 · 1331 阅读 · 0 评论 -
图的拓扑排序
参考:https://wangkuiwu.github.io/2013/04/11/topsort-cplus拓扑排序介绍拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph,简称 DAG)进行排序而得到一个有序的线性序列。比如:有这样一种情景,一个项目包括 A、B、C、D 四个部分来完成,并且 A 依赖于 B 和 D,C 依赖于 D。现在要制定一个计划,写出 A、B、C、D 的执行顺序。这时候,就需要用到拓扑排序,他就是用来确定事物的发生转载 2021-08-08 20:36:10 · 1092 阅读 · 0 评论 -
图的遍历之DFS与BFS
参考:https://wangkuiwu.github.io/2013/04/10/iterator深度优先搜索DFS图的深度优先遍历(Depth First Search)和树的先序遍历有一定相似之处,它的基本思想是:假设初始状态是图中所有顶点均未被访问,则从某个顶点 v 出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和 v 有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问转载 2021-08-08 20:23:25 · 267 阅读 · 0 评论 -
有向图的邻接矩阵与邻接表详细实现
有向图的邻接矩阵通过邻接矩阵来表示有向图。如下如所示:上面的有向图G2包含了“A, B, C, D, E, F, G”共7个顶点,而且包含了“<A, B>, <B, C>, <B, E>, <B, F>, <C, F>, <D, C>, <E, B>, <E, D>, <F, G>”共9条边。上图中右边的矩阵是有向图G2的邻接矩阵示意图。A[i][j] = 1表示第i个顶点到第j个顶点是一条边原创 2021-07-16 00:58:43 · 32505 阅读 · 1 评论 -
无向图的邻接矩阵与邻接表详细实现
无向图的邻接矩阵通过用邻接矩阵来表示无向图。如下无向图G1的邻接矩阵:无向图G1包含了“A, B, C, D, E, F, G”共七个顶点,而且包含了“(A, C), (A, D), (A, F), (B, C), (C, D), (E, G), (F, G)”共七条边。由于这是无向图,所以(A, C)和(C, A)是同一条边,这里列举边时,按照字母先后顺序列举的。无向图G1右边的邻接矩阵在内存中的邻接矩阵示意图。A[i][j] = 1表示第i个顶点与第j个顶点是邻接点,A[i][j] = 0表示它原创 2021-07-16 00:57:59 · 12931 阅读 · 0 评论 -
图的基本概念
图的概念图是由一些点vertex和这些点之间的连线边edge组成,通常记作:G = (V, E)。图的种类根据图是否有方向,可以将图划分为:无向图和有向图。无向图无向图如下如G1所示,无向图的边都是不区分方向的。G1 = (V1, {E1})。其中:V1 = {A, B, C, D, E, F}。V1表示由“A, B, C, D, E, F”几个顶点组成的集合。E1 = {(A, B), (A, C), (B, C), (B, E), (B, F), (C, F), (C, D), (E, F原创 2021-07-16 00:57:04 · 552 阅读 · 0 评论