慕课数据结构
文章平均质量分 82
bxg1065283526
希望现在开始为时不晚,努力一定会有收货
展开
-
08-图8 How Long Does It Take
思路:该题为拓扑排序,利用Topsort函数依次遍历,利用辅助数组earlyTime记录到达的某点的最短时间,每次遍历一个点后,减少该点的入度,若入度为0,则压入队列。#include<iostream>#include<queue>#define MaxNum 101#define INF 9999999using namespace std;int Node[...原创 2018-03-06 19:37:47 · 300 阅读 · 0 评论 -
1127. ZigZagging on a Tree
思路:通过递归,利用后序遍历和中序遍历进行建树,最后返回根结点,输出时,使用了两个辅助栈,单数栈和双数栈,单数栈对应的单数行的节点,单数栈压入栈的时候先压左节点,后压右节点,并且将结点压入双数栈,两个栈互相交替。并在压入栈的同时输出该结点的值。#include<iostream>#include<queue>#include<stack>#define M...原创 2018-03-17 11:19:07 · 378 阅读 · 0 评论 -
05-树7 堆中的路径
解题思路:首先建立一个空堆,将输入的数据插入空堆中,插入时,假设即将插入的数据X的位置在最末的一个叶子结点上,检查该结点的父节点(由于堆是一个有序的完全二叉树,其父节点为i/2),若比X小则跳出循环,比X大说明X应在父节点的位置上,于是将父节点的值赋给叶子结点,不断寻找当前结点的父节点与X值相比,直至跳出循环,跳出循环的下标值即X要插入的位置,打印输出时,从当前结点的下标值开始,不断找其父节点(即...原创 2018-03-03 19:35:42 · 167 阅读 · 0 评论 -
05-树8 File Transfer
解题思路:该题属于并查集,主要为查找,首先将所有结点的father都初始化为相应的下标,查找时,若father[X]!=X,则说明该结点已经与其他节点相连,找到其父节点,查看其父节点的father与其自身是否相等,若相等则说明这就是该集合的根,不相等继续递归寻找。并操作时只需要将两个其中一个结点的根结点值赋给两个集合的根结点值,两个集合就并在一起值得注意的是,在计数时,若有两个集合相并,集合数减少...原创 2018-03-03 20:54:50 · 316 阅读 · 1 评论 -
06-图1 列出连通集
解题思路:1.进行DFS遍历时,通常采用递归方法,加上一个辅助数据visited记录该点是否被访问过,如果i到j有边并且j没有被访问过,则对j进行递归DFS。2.进行BFS遍历时,采用队列辅助,将i所有的没有被访问过邻接点全部压入队列,完成后,弹出队列的头结点,再次将其没有被访问过的邻接点压入队列内,直至队列是空的(即队头指针等于队尾指针)。#include<iostream>#in...原创 2018-03-04 15:35:47 · 245 阅读 · 0 评论 -
06-图2 Saving James Bond - Easy Version
思路:该题是简单的对所有结点遍历,但是遍历的条件是两个节点的距离小于007可以jump的距离,辅助数组visited记录每个结点是否被访问,每次访问结点时检查该结点与岸边的距离,若小于jump,则可以被救,所有结点都被遍历完还不能到达岸边,则不能被救。代码中我对所有结点相对于原点距离以递增的顺序排序,有助于遍历的顺序。#include<iostream>#include<cma...原创 2018-03-04 18:46:25 · 187 阅读 · 0 评论 -
05-树9 Huffman Codes
整体思路:1.通过小根堆构建哈弗曼树,2.通过哈弗曼树算出其WPL(最小编码长度),并求出输入数据中的最小编码长度,两个相比较3.判断输入数据中的哈夫曼编码前缀是否有重叠,判断时选择对于输入的数据构造一个新树,构造过程中对叶子结点标记,若第二次访问该结点说明前缀有重复。#include<iostream>#include<string>#define MaxSize 6...原创 2018-03-04 12:48:37 · 307 阅读 · 0 评论 -
06-图3 六度空间
思路:该题主要是对某个结点进行广度优先遍历,难点是需要确定层数,数据结构慕课中,老师提供了一种思路,用tail变量记录每次压入队列的最后一个元素,然后赋给last,此时last记录的是当前那一层压入队列的最后一个结点,当该结点被弹出时,说明该一层已经全部遍历完,于是层数加一。其余的就是一个简单的广度优先遍历。#include<iostream>#include<queue>...原创 2018-03-04 21:58:55 · 283 阅读 · 0 评论 -
07-图5 Saving James Bond - Hard Version
思路:对照之前的简单版本,我使用了深度优先搜索,但是此时需要保存路径,深度优先遍历明显不好用,采用广度优先遍历,算法方面是普通模板,在保存路径方面,使用了一个辅助数组path[],当把符合的节点压入队列时,path[当前结点]=前一个结点,于是保存了整个路径,当我们读取路径时,只需要从知道最后一个结点,就可以知道整个路径,将结点压入栈内,最后在挨个弹出得到路径。#include<iostre...原创 2018-03-05 21:33:17 · 693 阅读 · 0 评论 -
07-图4 哈利·波特的考试
思路:将输入的数据构成邻接矩阵后,利用Floyd算法(只有五行代码),得到所有结点到其他节点的距离,然后遍历所有结点,得到当前结点到其最远节点的距离,然后得到最大距离,并记录其下标。即是答案#include<iostream>#define Maxsize 101#define INF 1000000using namespace std;int animal[Maxsize]...原创 2018-03-05 21:39:24 · 2286 阅读 · 0 评论 -
04-树6 Complete Binary Search Tree
思路:完全二叉树有一个性质,即层序输出时,下标为i的节点的左孩子和右孩子的下标分别为2i,2i+1,而二叉搜索树的中序输出为一个升序的序列,即当对输入的数据进行升序排列后获得了完全二叉排序树的中序遍历结果。已知中序遍历结果,我们还需要知道排列后的节点在层序输出时的序号,此时参考中序遍历的递归程序。下列代码中,我们调用mid_tree函数时,root值传参为1,函数内部可将其看成中序遍历的递归程序,...原创 2018-03-03 17:17:49 · 167 阅读 · 0 评论 -
04-树5 Root of AVL Tree(25 分)
题该参照主要点击打开链接代码内,singleLeft针对的是题目中如图一的情况,singleRight针对的是题目中Figure2的情况DoubleLeft针对的是题目中Figure4的情况,可以转化为先针对61结点进行singleRight,然后变成了SingleLeft的情况DoubleRight针对的是题目中的Figure3的情况,同样可以转化为先针对88结点进行singleLeft,然后就...转载 2018-03-03 16:00:48 · 158 阅读 · 0 评论 -
08-图7 公路村村通
思路:该题为最小生成树,利用Prime算法每次找到离最小生成树最近的没有被访问过的点加入最小生成树,直至所有点都加入了最小生成树。cost数组记录了点到最小生成树的距离,最开始是其他点到起点的距离,每次选择一个加入一个点后,检查没有加入的点的到新加入的点距离是否比之前到最小生成树的距离短,若小则更新。#include<iostream>using namespace std;#de...原创 2018-03-06 20:36:21 · 891 阅读 · 0 评论 -
08-图9 关键活动
思路:所谓关键活动即该结点的最早启动时间与最晚启动时间相等。而最早启动时间与图八的一样,关键是获得结点的最晚启动0时间,与最早启动时间相对应,最早启动时间是获得入度为的点---即出发点,最晚启动时间出度为0,逆序遍历,最晚启动时间是后一个结点减活动所需时间中的最小值,遍历时若结点的出度为0则压入队列内,最后比较最早启动时间和最晚启动时间,两者相等,则该节点参与了关键活动,找到该结点指向的另一个结点...原创 2018-03-06 22:04:05 · 259 阅读 · 0 评论 -
排序算法
#include<iostream>#include<algorithm>#define MaxSize 100001using namespace std;void printLine(long Number[] , int N) {//输出 for (int i = 0; i<N; i++) { if (i == 0) cout <<...原创 2018-03-07 17:30:46 · 125 阅读 · 0 评论 -
根据后序和中序遍历输出先序遍历
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。输入格式:第一行给出正整数NN(\le 30≤30),是树中结点的个数。随后两行,每行给出NN个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。输出格式:在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。输入样例:72 3 1 5 7 6...原创 2018-03-14 21:18:52 · 447 阅读 · 0 评论 -
树的同构
最近为了准备PAT考试,重新复习了数据结构,把数据结构的题发上来,以便于自己日后复习和树有关的操作一般都可以通过递归来很清晰地实现,递归中注意跳出递归的条件(就是两个节点为空的情况)1.当甲与乙中至少有一个空树的时候,则甲与乙必须同时为空树,否则就不可能为同构2.甲与乙不为空时,但是数据不同也不同构3.最重要的就是要判断甲的左跟乙的右&&甲的右与乙左是否相等,相等说明左右子树有交换...原创 2018-03-02 16:09:05 · 361 阅读 · 0 评论 -
03-树2 List Leaves
思路:首先要找到这棵树的根,输入的数据是儿子节点,在输入过程中标记所有儿子节点,最后寻找没有被标记的点即为头结点,由于需要自上而下从左到右,层次遍历符合目标,层次遍历需要辅助结构-----队列,构造一个队列,首先将头结点压入队列,弹出队首结点,将该结点不是空的儿子节点压入队列。然后循环,弹出元素,将不是空的儿子节点压入队列,若左右儿子均为空,则输出,直至队列为空。#include<iostr...原创 2018-03-03 08:55:40 · 110 阅读 · 0 评论 -
03-树3 Tree Traversals Again
问题思路:用栈遍历树其实是先序遍历,在输入时,构造一个栈,根据输入顺序构建树,最终使用递归方法后序遍历树。#include<iostream>#include<string>#include<stack>using namespace std;#define MaxSize 30typedef struct Node { int Data; ...原创 2018-03-03 11:01:05 · 167 阅读 · 0 评论 -
04-树4 是否同一棵二叉搜索树
解题思路:首先保存输入的第一组数据,该组数据与其他组信息比较,在输入数据时保存数据的根结点,根据根结点构造树,递归比较两棵树的元素大小。#include<iostream>using namespace std;typedef struct Tree { int data; Tree *left; Tree *right;}search,*search_tree;v...原创 2018-03-03 13:36:05 · 129 阅读 · 0 评论 -
模板-根据中序,后序建树层次遍历输出
#include<iostream>#include<malloc.h>#include<queue>#define maxn 35using namespace std;int in[maxn],post[maxn];struct stu{ int num; stu *l,*r;};int n;void build(stu *&...原创 2018-03-16 23:22:34 · 180 阅读 · 0 评论 -
07-图6 旅游规划
思路:该题只是简单地用Dijkstra算法,算出两点之间的最短距离和最短花费,并且只需要当距离相同时才需要算最短花费。#include<iostream>#define Maxsize 501using namespace std;int N, M, S, D;int length[Maxsize][Maxsize], cost[Maxsize][Maxsize];int d...原创 2018-03-05 22:39:39 · 257 阅读 · 1 评论