![](https://img-blog.csdnimg.cn/20201014180756925.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 评论 -
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 评论 -
树的同构 (25分)
树的同构 (25分)思路分析:树的同构,顾名思义两个树是否有一样的结构,每一个孩子结点的孩子的数量和值都要相同,但是它所在的位置可以左右交换(不是说两个父亲结点的孩子互相交换,而是说父亲结点的下一层孩子的左右可以交换),这样就转化了越来越小的树比较是否同构,假如有两个树A,B。A树的左子树和B树的右子树同构,B树的左子树和A树的右子树同构,那么这两个树是同构的,也就是说,又回到了之前括号里面的说的,左右顺序没有关系。我们将结点以结构体数组的方式存储,一个树就是一个结构体数组,每一个结构体数组包含的原创 2020-07-24 21:30:48 · 2141 阅读 · 0 评论 -
习题1.9 有序数组的插入 (20分)
习题1.9 有序数组的插入 (20分)思路分析:将要插入的数字n和已经是递减排序好的数列元素进行比较,从左到右进行遍历,直到有一个元素小于小于n,记录位置为tempposition,然后将n右边的元素右移,将n插入到这个位置,注意其中判断数列是否满或者n是否与数列元素相同bool Insert( List L, ElementType X ){ int i =0; int tempPosition; while(L->Data[i]>X) {原创 2020-07-19 20:20:43 · 479 阅读 · 0 评论 -
习题1.8 二分查找 (20分)
二分查找思路分析:核心是在已经排序好的数列中找到中位数,然后把要找的数和中位数比较,然后收缩左右边界,最后找到那个数字。注意要判断这个数是否在这个线性表中,找不到就返回 NotFound函数接口:/*#define MAXSIZE 10000typedef int Position;typedef struct LNode{ElementType Data[MAXSIZE];Position Last;}*List;*///元素从下标 1 开始存储//方法一:(采用递归)Posit原创 2020-07-19 16:40:44 · 185 阅读 · 0 评论 -
实例1.1 最大子列和问题 (20分)
实例1.1 最大子列和问题 (20分)思路分析:本题有三种基本的算法,分别为1.两个循环控制 2.二分法 3.在线处理,其中在线处理的时间复杂度为O(n),这是效率比较高得算法,所以选择它,在线处理的核心思想是,当前n项和小于0时,便舍弃当前计算的前n项和,并且将临时保存的最大值舍弃,然后再依次向下累加,题目中还说如果输入的数都为负数,那么便直接输出0,如果要检查都是负数的意思就是,只有要一个数是正整数数我们可以确保这个数组不全是负数#include <iostream>#define M原创 2020-07-18 16:49:12 · 844 阅读 · 0 评论