![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
少女終末旅行
雨だれの歌
展开
-
树遍历的应用——树的重建 | Reconstruction of the Tree | C/C++实现
问题描述现有两个结点序列,分别是对同一个二叉树进行前序遍历和中序遍历的结果。请编写一个程序,输出该二叉树按后序遍历时的结点序列。输入:第1行输入二叉树的结点数n。第2行输入前序遍历的结点编号序列,相邻编号用空格隔开。第3行输入中序遍历的结点编号序列,相邻编号用空格隔开。结点编号为从1至n的整数。请注意,1不一定是根结点。输出: 在1行中输出按后序遍历的结点编号序列。相邻结点编号之间用...原创 2019-01-31 13:48:35 · 290 阅读 · 0 评论 -
拓扑排序 | Topological Sort | C/C++实现
问题描述有向无环图DAG可用来表示各种事物的顺序。比如以各项工作为顶点,用有向边来表示工作顺序。如果对这种表示顺序关系的DAG进行拓扑排序,我们便能得到一个恰当的工作顺序。对于一个有向无环图DAG,只要存在边(u, v),就让u在线性序列中位于v之前,这就是拓扑排序。请编写一个程序,输出对给定DAG G进行拓扑排序后的顶点顺序。输入:输入按照以下形式给出∣V∣|V|∣V∣ ∣E∣|E|∣...原创 2019-02-06 20:33:33 · 657 阅读 · 0 评论 -
广度优先搜索 | BFS | Breadth First Search | C/C++实现
问题描述请编写一个程序,求给定的有向图G(V,E)G(V, E)G(V,E)中顶点1到各顶点的最短路径d(路径边数的最小值)。各顶点编号分别为1至n。如果从顶点1出发无法到达某顶点,则与该顶点的距离记为-1。输入: 第1行输入G的顶点数n。接下来n行按如下格式输入各顶点u的邻接表。u k v1 v2 … vk其中u为顶点编号,k为u的度,v1 v2 … vk为与u相邻的顶点编号。输出: ...原创 2019-01-29 19:01:16 · 527 阅读 · 0 评论 -
连通分量 | Connected Components | C/C++实现
问题描述请编写一个程序,输入SNS的朋友关系,判断从指定人物出发能否通过双向朋友链抵达人物。输入: 第1行输入代表SNS用户数的整数n以及代表朋友关系数的m,用空格隔开。SNS各用户的ID分别为0到n-1。接下来的m行输入朋友关系,每个朋友关系占1行。1个朋友关系包含s、t这两个整数,表示s和t为朋友。s、t输入时用空格隔开。紧接下来的1行输入问题数q。再接下来的q行输入问题。各问题均为...原创 2019-01-29 22:43:19 · 1487 阅读 · 0 评论 -
最小生成树 | Minimum Spanning Tree | 普里姆Prim算法 | C/C++实现
问题描述请编写一个程序,计算给定加权图G=(V,E)G=(V,E)G=(V,E)的最小生成树的各边权值之和。输入: 第1行输入G的顶点数n。接下来n行输入表示G的n∗nn*nn∗n邻接矩阵A。A的元素aija_{ij}aij代表顶点iii到顶点jjj的边的权值。另外,边不存在时记为-1。输出: 输出G的最小生成树的各边权值总和,占1行。限制:1 ≤ n ≤ 1000 ≤ aija_{...原创 2019-01-30 13:14:22 · 584 阅读 · 0 评论 -
树的表示 | Tree | C/C++实现
问题描述请编写一个程序,输出给定有根树T中各节点u的信息,信息内容如下:u的结点编号u的结点种类(根、内部节点、叶)u的父节点编号u的子结点列表u的深度这里我们设给定树拥有n个结点,编号分别为0至n - 1。输入: 第1行输入结点的个数n。接下来n行按照下述格式输入各结点的信息,每个结点占一行。id k c1 c2 … ckid为结点的编号,k为度。c1 c2 … ck为第1个...原创 2019-01-30 16:38:55 · 1444 阅读 · 0 评论 -
二叉树 | Binary Tree | C/C++实现
问题描述给定有根二叉树T,请编写一个程序,输出其各结点u的如下信息:u的结点编号u的深度u的父结点u的高u的兄弟结点结点的种类(根、内部结点、叶)u的子结点数设给定二叉树拥有n个结点,编号分别为0至n-1。输入: 第1行输入结点的个数n。接下来n行按照下述格式输入各结点的信息,每个结点占1行。id left rightid为结点编号,left为左子结点编号,right为右子...原创 2019-01-30 18:12:59 · 347 阅读 · 0 评论 -
树的前序、中序、后序遍历 | Tree Walk | C/C++实现
问题描述请根据下述算法编写一个程序,系统地访问给定二叉树的所有节点。1.按照根结点、左子树、右子树的顺序输出结点编号。这称为树的前序遍历(Preorder Tree Walk)。2.按照左子树、根结点、右子树的顺序输出结点编号。这称为树的中序遍历(Inorder Tree Walk)。3.按照左子树、右子树、根结点的顺序输出结点编号。这称为树的后序遍历(Postorder Tree Wal...原创 2019-01-31 12:07:33 · 493 阅读 · 0 评论 -
关节点 | Articulation Point | C/C++实现
问题描述请列举出无向图G=(V,E)G=(V,E)G=(V,E)的关节点。在连通图G中,如果删除顶点u及从u出发的所有边后所得的子图不连通,我们就称顶点u为图G的关节点(Articulation Point)或连接点。输入:输入按照以下形式给出∣V∣|V|∣V∣ ∣E∣|E|∣E∣s0s_0s0 t0t_0t0s1s_1s1 t1t_1t1…s∣E∣−1s_{|E|-1}...原创 2019-02-13 12:17:27 · 1385 阅读 · 0 评论 -
树的直径 | Diameter of a Tree | C/C++实现
问题描述请求出权值非负的无向树T的直径。我们将树的最远结点之间的距离称为树的直径。输入:输入按照以下形式给出nnns1s_1s1 t1t_1t1 w1w_1w1s2s_2s2 t2t_2t2 w2w_2w2…sn−1s_{n-1}sn−1 tn−1t_{n-1}tn−1 wn−1w_{n-1}wn−1第1行输入表示树结点数的整数n。树的各结点编号分别为0到n-1...原创 2019-02-13 14:39:25 · 1203 阅读 · 0 评论 -
深度优先搜索 | DFS | Depth First Search | C/C++实现
问题描述在图的搜索算法中,深度优先搜索采取的思路是尽可能地访问相邻顶点。设仍存在未搜索邻接边的顶点中最后一个被发现的顶点为v,那么深度优先搜索就是对顶点v的邻接边递归地进行搜索。当v的边全部搜索完毕后,程序沿发现v时所经过的边回归,继续搜索前一顶点。搜索一直持续到发现当前起点可到达的所有顶点为止。如果仍有顶点未被发现,则选择其中编号最小的一个作为新起点继续搜索。深度优先搜索中,需要对各顶点记...原创 2019-01-29 16:44:20 · 737 阅读 · 0 评论 -
图的表示 | Graph | C/C++实现
问题描述表示图G=(V,E)G=(V,E)G=(V,E)有两种方法,一种是邻接表(Adjacency List),一种是邻接矩阵(Adjacency Matrices)。邻接表法中,我们对VVV的每个顶点都用一个表来表示,总计用|V|个表Adj[∣V∣]Adj[|V|]Adj[∣V∣]来表示图。对于顶点uuu,邻接表Adj[∣V∣]Adj[|V|]Adj[∣V∣]中包含所有与(u,vi)(u,...原创 2019-01-29 11:40:11 · 1354 阅读 · 0 评论 -
范围搜索 | KD树 | Range Search (KD Tree) | C/C++实现 | 大年三十写CSDN
问题描述从拥有多个属性的报表集合(数据库)中,寻找具有特定属性且位于指定范围内的元素,这列问题被称为范围搜索。请编写一个程序,对于二维平面上点的集合,例举出给定范围内的点。另外,给定的点集合无法进行点的添加和删除操作。输入:nx0 y0x1 y1…xn-1 yn-1qsx0 tx0 sy0 ty0sx1 tx1 sy1 ty1…sxq-1 txq-1 sy1-1 tyq-...原创 2019-02-04 14:42:13 · 2801 阅读 · 0 评论 -
二叉搜索树——插入 | Binary Search Tree 1 | C/C++实现
问题描述下述伪代码所示的insert用于在二叉搜索树T中插入新值v。insert将键值为v,左子树为NIL,右子树为NIL的点z作为实参,插入T的适当位置。insert(T, z) y = NIL //x的父结点 x = 'T的根结点' while x != NIL y = x//设置父结点 if z.key < x.key x = x.left//移动至左子结点 ...原创 2019-01-31 17:36:48 · 359 阅读 · 0 评论 -
二叉搜索树——搜索 | Binary Search Tree 2 | C/C++实现
问题描述请编写一个程序,在二叉搜索树——插入的基础上添加find命令,对二叉搜索树T执行下述命令:insert k:在T中插入键值kfind k:报告T中是否包含键值kprint:分别用树的中序遍历和前序遍历算法输出键值输入: 第1行输入命令数m。接下来m行以insert k、find k、print的格式输入命令,每个命令占一行。输出: 每执行1次find k命令后,当T含有k时输出...原创 2019-01-31 19:36:46 · 221 阅读 · 0 评论 -
二叉搜索树——删除 | Binary Search Tree 3 | C/C++实现
问题描述请编写一个程序,在二叉搜索树——搜索的基础上添加delete命令,对二叉搜索树T执行下述命令:insert k:在T中插入键值kfind k:报告T中是否包含键值kdelete k:删除包含键值k的结点print:分别用树的中序遍历和前序遍历算法输出键值delete k命令用于从二叉搜索树T中删除包含给定键值k的结点z。删除z时需要根据下述算法讨论三种情况,以确保树在更新链接后...原创 2019-02-01 13:11:41 · 363 阅读 · 0 评论 -
完全二叉树 | Complete Binary Tree | C/C++实现
问题描述请编写一个程序,读取以完全二叉树形式表示的二叉堆,并按照下述格式输出二叉堆各结点的数据。node id: key = k, parent key = pk, left key = lk, right key = rk,其中id为结点编号(下标),k为结点的值,pk为父结点的值,lk为左子结点的值,rk为右子结点的值。当结点不存在时,不进行输出。输入: 第1行输入堆的大小H。接下来1...原创 2019-02-02 10:13:56 · 854 阅读 · 0 评论 -
最大/最小堆 | Maximum Heap | C/C++实现
问题描述请根据以下伪代码编写一个程序,使用给定数组生成最大堆。maxHeapify(A, i)用于从根结点 i 向叶结点方向寻找A[i]值的恰当位置,从而使以 i 为根结点的子树成为最大堆。这里我们设堆的大小为H。maxHeapify(A, i) l = left(i) r = right(i) //从左子结点、自身、右子结点中选出值最大的结点 if l <= H &&...原创 2019-02-02 11:13:31 · 899 阅读 · 0 评论 -
优先级队列 | Priority Queue | C/C++实现
问题描述优先级队列(Priority Queue)是一种数据结构,其存储的数据集合S中,各个元素均包含键值。优先级队列主要进行下述操作:insert(S, k):向集合中插入元素kextractMax(S):从S中删除键值最大的元素并返回该键值请编写一个程序,对优先级队列S执行insert(S, k)和extractMax(S)。队列元素为整数,键值为其自身。输入: 对优先级队列S输入多...原创 2019-02-02 12:35:21 · 491 阅读 · 0 评论 -
单源最短路径1 | Dijkstra狄克斯特拉 | Single Source Shortest Path 1 | C/C++实现
问题描述请编写一个程序,求给定加权图有向图G=(V,E)G=(V,E)G=(V,E)的单源最短路径的成本。请以G的顶点0为起点,输出0到各顶点v的最短路径上各边权值的总和d[v]。输入: 第1行输入G的顶点数n。接下来n行按如下格式输入各顶点u的邻接表:u k v1 c1 v2 c2 … vk ckG各顶点编号分别为0至n-1。u代表顶点的编号,k代表u的出度。vi (i = 1, 2, ...原创 2019-02-02 17:32:28 · 356 阅读 · 0 评论 -
单源最短路径2 | Dijkstra狄克斯特拉 | Single Source Shortest Path 2 | C/C++实现
问题描述请编写一个程序,求给定加权有向图G=(V,E)G=(V,E)G=(V,E)的单源最短路径的成本。请以G的顶点0为起点,输出0到各顶点v的最短路径上各边权值的总和d[v]。输入: 第1行输入G的顶点数n。接下来n行按如下格式输入各顶点u的邻接表u k v1 c1 v2 c2 … vk ckG中的各顶点编号分别为0至n-1。u代表顶点的编号,k代表u的出度。vi(i = 1, 2, …...原创 2019-02-02 21:55:37 · 372 阅读 · 0 评论 -
互质的集合 | Disjoint Set: Union Find Tree | C/C++实现
问题描述请实现一个管理互质动态集合S = {S1, S2, …, Sk}的程序。首先读取整数n,创建由0, 1, …, n-1这样n个互不相同的元素组成的集合。然后读取整数q,对集合进行q个查询操作。查询包含以下2种:unite(x, y):合并包含x的集合SxS_xSx与包含y的集合SyS_ySysame(x, y):判断x与y是否包含于同一集合输入:n qcom1 x1 y...原创 2019-02-03 23:40:11 · 762 阅读 · 1 评论 -
最小生成树 | Minimum Spanning Tree | 克鲁斯卡尔Kruskal算法 | C/C++实现
本文为克鲁斯卡尔算法(Kruskal’s Algorithm)对于求最小生成树的另一种算法:普里姆算法(Prim’s Algorithm)请见:最小生成树 | Minimum Spanning Tree | 普里姆Prim算法 | C/C++实现问题描述请编写一个程序,对于给定的加权图G=(V,E)G=(V,E)G=(V,E),输出其最小生成树的各边权值总和。输入:∣V∣|V|∣V∣ ∣...原创 2019-02-13 16:55:06 · 516 阅读 · 0 评论