![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法第二版
华岩寺扎克伯格
Being humble and diligent.
展开
-
08-图8 How Long Does It Take (25分)
08-图8 How Long Does It Take (25分)#include<iostream>#include<queue>#define MaxSize 100#define INFINITY 63225using namespace std;int MGraph[MaxSize][MaxSize];int Dist[MaxSize]={0};int InDegree[MaxSize];int N,M;//N represented the numbe原创 2020-09-01 22:46:16 · 116 阅读 · 0 评论 -
08-图7 公路村村通 (30分)
08-图7 公路村村通 (30分)#include <iostream>using namespace std;#define INFINITY 63325#define MaxSize 1005#define ERROR -1int Dist[MaxSize];//distance from MST to Nodeint Map[MaxSize][MaxSize];//a matrix which is used to restore city numbers and path原创 2020-09-01 22:44:27 · 132 阅读 · 0 评论 -
07-图6 旅游规划 (25分)
07-图6 旅游规划 (25分)#include <iostream>#define MaxSize 501#define INFINITY 63325#define ERROR -1using namespace std;typedef struct Node{ int Expense; int Length;} MGraph[MaxSize][MaxSize];MGraph G;int Collected[MaxSize]={0};int Dist[M原创 2020-09-01 22:43:14 · 130 阅读 · 0 评论 -
07-图4 哈利·波特的考试 (25分)
07-图4 哈利·波特的考试 (25分)解题思路:根据题目的意思就是找任意两个点之间的最短路径,也就是多源最短路径的算法,即Floyd算法(弗洛伊德算法),里面要注意的细节是,因为顶点是从1开始,所以在生成邻接矩阵的时候,我这里采用的是从下标1开始初始化为INFINITY#include<iostream>#define MaxVertexNum 101#define INFINITY 65535using namespace std;//定义图的存储结构-邻接矩阵typedef原创 2020-08-17 22:23:33 · 260 阅读 · 0 评论 -
06-图3 六度空间 (30分)
06-图3 六度空间 (30分)思路分析:这里主要列举一下自己犯的错误,因为这个题目要求每一个结点都要BFS,所以说每一个结点BFS之前都要将Visited数组初始化为没有访问的状态,我忘记了,所以运行一直是错误。还要注意的是,这里是从1开始的,所以Visited数组存储最好也从1开始。之所以这里选择邻接表的存储方式,是因为由题意得知 N*(N-1)=N*33,N解出来等于67,所以当N越大,M也就越小,所以这是一个 稀疏图,用邻接表的方式最好。代码写得有点零乱…#include<iostr原创 2020-08-14 20:22:16 · 174 阅读 · 0 评论 -
06-图2 Saving James Bond - Easy Version (25分)
06-图2 Saving James Bond - Easy Version (25分)思路分析:007每跳一次实际上就是在半径为20的圆里面寻找是否有可以连通的点,第一次跳跃很特殊,因为岛的直径是15,所以要第一次跳跃(20+7.5)才是要寻找的范围。每一次跳跃都是相同的距离,我们可以知道 这个过程就像是深度优先搜索的策略,跳到一个点然后一直往深处寻找下一个可以连通的点,找不到,也就是007跳不到岸上,就重新返回上一个结点。DFS是针对连通图的一个遍历,但是这里其实我们假设每一个点都是连通的,但是是否原创 2020-08-13 17:34:25 · 127 阅读 · 0 评论 -
06-图1 列出连通集 (25分)
06-图1 列出连通集 (25分)解题思路 :由于题目给的是非连通图,所以要考虑到BFS 和 DFS外面还需要嵌套一层循环#include<iostream>#include<queue>using namespace std;typedef struct VNode{ int Nv,Ne; int Data[10][10];}*MGraph;typedef struct ENode{ int V1; int V2;}*Edge;原创 2020-08-13 15:27:52 · 756 阅读 · 0 评论 -
第六章 图(更新中....)
图不同于树,树是一种具有层次关系的结构,而在图中的任意两个顶点都可能有关系。图(Graph),顶点(Vertex),边(Edge)因此图可以表示为: G=(V,E),每一条边是一顶点对(V,W)。图和线性表,树的比较:1.线性表中的数据叫元素,树中的数据叫结点,图中的数据叫顶点2.线性表中没有元素叫空表,树中没有结点叫空树,图中必须至少有一个顶点,但是边集可以为空图的相关术语:1.无向图(Undirected Graphs)2.有向图(Directed Graphs)3.简单图(Simpl原创 2020-08-10 22:25:38 · 100 阅读 · 0 评论 -
05-树8 File Transfer (25分)
05-树8 File Transfer (25分)思路分析:本题的意思就是给出一串数字让你检查他们是否有在一个集合,因为计算机是双向连接,所以就相当于是一颗树,将他们并在一起。值得注意的是,我们将这些树存放在数组中,数组的下标就是计算机的序号(也就是节点的值),数组的值就是他对应的父节点。首先我们要进行初始化,将每一个父节点初始化为-1,尽量少使用全局变量,所以这里typedef了一个数组类型然后记得要在主函数中初始化对象。#include <iostream>#define Max原创 2020-08-09 18:03:35 · 183 阅读 · 0 评论 -
05-树7 堆中的路径 (25分)
05-树7 堆中的路径 (25分)思路分析:题目的意思是输入节点值,要把这个节点构成最小堆,可以采取两个思路,一个是动态插入,也就是插入一个就马上构成一个最小堆,这样的话会用到最小堆的插入算法,也就是每插入一个数先暂时在最后生成一个节点,运用完全二叉树的性质,父亲节点为 (i/2),来比较大小,如果要插入的树小于父节点,那么将父节点移动到新生成的这个节点,我们用数组来实现,每要生成节点,那么这个节点的位置就是这个二叉树的规模。第二个方法就是先按照生成完全二叉树的办法将每一个节点无序放入,然后从最后一个原创 2020-08-09 16:01:31 · 251 阅读 · 0 评论 -
04-树6 Complete Binary Search Tree (30分)
04-树6 Complete Binary Search Tree (30分)原帖地址:Cnblogs解题思路:这里要用到完全二叉树的性质,即如果有结点数为n的完全二叉树,对任一节点 i (1<=i<=n)都有,如果i=1,则i是二叉树的根,如果i>1,则其双亲是结点[i/2];如果2i>n,则结点i无左孩子,否则其左孩子是结点2i;如果2i+1>n,则结点i无右孩子,否则其右孩子是结点2i+1从给出的样本可以知道,将输入的有序节点进行排序以后,得到了该完全二叉搜索树转载 2020-08-07 11:18:06 · 252 阅读 · 2 评论 -
04-树5 Root of AVL Tree
04-树5 Root of AVL Tree思路分析:这道题思路很清晰,主要就是熟悉二叉平衡树的插入,知道LL,RR,LR,RL旋转的算法就可以解决#include<iostream>using namespace std;typedef struct AVLTNode* AVLTree;struct AVLTNode{ int height; AVLTree left, right; int data;};AVLTree insert(AVLTre原创 2020-07-29 18:00:57 · 149 阅读 · 1 评论 -
04-树4 是否同一棵二叉搜索树 (25分)
04-树4 是否同一棵二叉搜索树 (25分)思路分析:本体整体的思路很明显,先输入二叉搜索树的结点个数,然后输入要比较的二叉搜索树的个数,之后进入循环迭代,首先要构建一个要进行比较的模板二叉树,然后再构建要比较的函数,这里用到了很多函数的方法,值得注意的是C++的实现,必须在main函数之前提供函数的声明。Tree makeNewTree(int n );用来生成二叉搜索树Tree treeNewNode(int v);生成新的结点Tree insert(Tree T, int v);因为是通过用原创 2020-07-29 16:17:07 · 430 阅读 · 1 评论 -
03-树3 Tree Traversals Again (25分)
03-树3 Tree Traversals Again (25分)思路分析:给出的样例就是说如果按照堆栈操作那么,出来的就是这个二叉树的中序遍历的结果,然后push操作的值就是二叉树前序遍历的结果,所以题目的意思就是,已知一个二叉树的中序遍历和前序遍历求得这个二叉树的后序遍历每次在前序遍历中寻找根节点,然后从中序遍历中获取左子树和右子树的个数,然后再构造后序遍历数组,后序遍历数组的最后一位是根节点,然后每一次划分子树以后,那么该序列的最后一位也是 该子树的根, 采用递归逐渐将前序和中序遍历的结果划原创 2020-07-26 22:27:55 · 103 阅读 · 0 评论 -
03-树2 List Leaves (25分)
03-树2 List Leaves (25分)思路分析:本体要自己创建一个二叉树,然后按照层序输出叶节点,一说到层序我们就会想到层序遍历,层序遍历我们常用的方法无非是队列,从根节点开始进入队列,设置一个临时变量,判断队列是否为空,然后获取队列头元素,然后出栈,并且输入它,判断这个临时变量是否有左右孩子如果有,则依次将左孩子,右孩子进入队列,依次类推反复执行。这道题要用到queue的库函数,就用C++来实现的,queue容器提供了以下的操作:front():返回 queue 中第一个元素的引用。如果原创 2020-07-25 15:10:52 · 154 阅读 · 0 评论 -
树 第四章
树 第四章本章的内容有:树,树的基本性质,二叉树,二叉树的顺序存储,二叉树的链式存储,二叉树的遍历(先序遍历,中序遍历,后序遍历),二叉树的应用引子:当说到查找的时候,目前所学的查找都是在有序数列中进行查找,也就是所说的静态查找,比如说通过顺序查找(将序号为0的数列设置为哨兵,从后面往前查找),二分查找(通过每次二分,将查找的范围缩小一半,时间复杂度为O(logn))。当数据变得繁琐起来,比如说出现了插入和删除,我们就进入了二叉树的结构树就像我们生活中看到的树一样,有根节点,有子节点,有叶节点二叉树原创 2020-07-23 21:56:44 · 120 阅读 · 0 评论 -
线性结构(第三章)
教材:数据结构(第二版)主编:陈越线性结构:所谓线性结构就是数据像一条线一样串在一起,是一个抽象的概念,其中每一个元素都是直接前驱和直接后驱,数据的存储分为逻辑结构和物理结构,物理结构包括了顺序存储(在内存中用地址连续的一块存储空间顺序存放数据)和链式存储(不需要连续的存储空间),逻辑结构包括了诸如线性表,树,集合,图等,而常见的数组其实是线性表的一种实现,但是线性表和数组之间没有从属关系。线性表的典型应用就是堆栈和队列;顺序存储和逻辑存储的优缺点(原帖地址)本章讲解了:线性表(List)的顺序存储(原创 2020-07-22 22:40:36 · 155 阅读 · 0 评论