数据结构
Love_Irelia97
大彩笔~~~
展开
-
迷宫问题/n*m方格阵电路布线问题
啊,被FDU无住宿无补贴劝退了,985终究一场梦,只好拿起自己学校的教材了我们这本教材比较经典的就是电路布线问题了,估计和这方面成果不错有点关系。其实我今天仔细看了看发现这不就是迷宫的路径搜索问题吗......主要的思想还是深度优先搜索、回溯法......参考了教材上的做法以后,发现其实思路都差不多,只不过我和它的标记和存储方法不同。我的做法是,初始化时用-2标记障碍点,用-1标记可布...原创 2018-09-08 13:18:19 · 1097 阅读 · 0 评论 -
AVL树的构造、插入和删除(C++)
昨天搞了一个晚上,可算是把AVL树的概念搞明白。而后又参阅了大量的博客和书籍,终于是自己搞了一套代码(期间各种BUG搞得我欲仙欲死= =、)虽然考研可能不要求实现,但还是写点东西,就算是自己总结一下吧。AVL树是一种BST(二叉搜索树),但是AVL是需要保持平衡的,即若AVL非空,那么它上面每一结点的左、右子树高度之差的绝对值不超过1,即 ,其中hl - hr记做平衡因子bf定义部分:...原创 2018-09-29 14:12:24 · 3287 阅读 · 2 评论 -
构造二叉排序树(BST)+二叉排序树的删除
主要是删除操作二叉排序树的删除1. 删除叶结点,直接删除2. 删除结点p只有左子树或右子树,让其子树替代该结点p即可3. 删除结点p既有左子树又有右子树,以该结点p为根,查找中序遍历下第一个结点t,使这个结点t替换p结点(val覆盖即可),再递归一次删除这个结点t即可#include <iostream>#include <string>using na...原创 2018-09-28 21:57:24 · 507 阅读 · 0 评论 -
构造中序线索二叉树
主要是利用二叉树的空指针域,若为空,使左指针指向前驱,并标记ltag为1;使右指针指向后驱,并标记rtag为1;要注意的是构造结束后,此时pre指向最后一个结点,此时需记得pre->right = nullptr, pre->rtag = 1。否则这棵树的右子树无法遍历;这样使得这些指针域不至于浪费,并能够加快查找结点前驱和后继的速度。#include <iostr...原创 2018-09-28 14:41:26 · 2112 阅读 · 1 评论 -
使用邻接矩阵+Dijkstra算法求解单源最短路径问题
Dijkstra算法是求解有向非负带权图中某一结点到其它结点的最短路径算法。这个算法和Prim算法求解最小生成树有点相似,它也是先有一个初始顶点,然后查找最小带权路径。不同的是,Prim需要更新最小生成树的结点,不断将结点更新到VT中,然后更新low_cost[]数组,是VT中的各结点到V-VT中的各结点的最小路径。而Dijkstra算法更新的dist[]数组,仅仅是源点到其他点的最短路径...原创 2018-09-14 13:31:48 · 2003 阅读 · 0 评论 -
用克鲁斯卡尔(Kruskal)算法构造最小生成树(最小支撑树)
Kruskal算法和Prim算法相比,就是Kruskal算法从边出发,不断寻找当前未添加进Et的、且权值最小的边,若添加后不形成环,则添加成功;否则跳过,继续尝试添加下一条边。最后,判断边的数量arcnum是否是点的数量vexnum-1,若是则最小生成树构造成功,否则失败。Prim算法与顶点相关时间复杂度O(|V|²),所以适合顶点少边多的图;Kruskal反之,算法与边相关,时间复杂度为...原创 2018-09-14 01:40:27 · 10887 阅读 · 4 评论 -
二叉树后序中序遍历序列确定前序问题
任务:给定一颗有n个结点的二叉树,结点的编号是1,2,3,...,n。已知二叉树结点编号的后序和中序列表,试设计一个算法,确定该二叉树结点编号的前序列表。输入:第1行有1个正整数n,表示给定的二叉树有n个结点。接下来的两行中,第1行是二叉树结点的后序遍历列表,第2行是二叉树结点的中序遍历列表输出:二叉树的前序遍历列表 测试输入:53 4 5 2 13 4 1 5 2...原创 2018-09-10 15:30:55 · 462 阅读 · 0 评论 -
子树问题
任务:对于给定的二叉树,计算二叉树各结点自己为根时子树的结点数,并按前序输出输入:第1行有1正整数n,表示给定的二叉树有n个顶点,编号为1,2,3,...n。接下来n行中,每行有3个整数a,b,c,分别表示编号为a的结点的左儿子编号为b,右儿子编号为c,为0表示没有儿子。各结点信息按照层序列表的顺序给出输出:将计算出的以二叉树各结点为根的子树的结点数按照前序列表输出 输入样例:...原创 2018-09-10 13:11:06 · 318 阅读 · 0 评论 -
多叉树最近公共祖先问题(LCA)
任务:设计一个算法,对于给定的树中两结点,返回它们的最近公共祖先输入:第1行有一个正整数n,表示给定的树有n个结点。结点编号为1,2,3,...,n,编号为1的顶点是树根。接下来n行中,第i+1行描述了第i个结点的儿子情况。每行的第一个正整数k表示该结点有k个儿子,其后k个数中,每一个数表示其儿子结点的编号。当k=0时表示该结点为叶节点。输入的第n+2行是一个正整数m,表示要计算最近公共祖...原创 2018-09-10 12:17:38 · 4699 阅读 · 0 评论 -
层序列表问题(二叉树的层次遍历)
问题描述:对树中结点按层序列表是指先列树根,然后从左到右一次列出所有深度为1的节点,再从做到右地列出深度为2的节点,等等。层序列表问题要求对一颗给定的二叉树按层序列表。数据输入:第一行为一个整数n,表示给定的二叉树有n个顶点。接下来的n行中,每行有3个整数a,b,c 分别表示编号为a的节点的左儿子b和右儿子c。0表示结点为空。51 4 24 3 02 5 03 0 05 0 0...原创 2018-09-10 10:32:55 · 457 阅读 · 0 评论 -
链表解决约瑟夫环(Josephus)问题
这里存储的出列的序列,如果只想要最后一人输出res[n-1]就好了#include <iostream>#include <list>using namespace std;void Josephus(int n, int m, int res[]){ if( n<=0 || m<=0 ) return; list<int>...原创 2018-09-10 09:10:15 · 431 阅读 · 0 评论 -
用邻接矩阵+普里姆(Prim)算法构造最小生成树(最小支撑树)
首先什么是最小生成树(我的教材称为最小支撑树)?它是一个图的极小连通子图。那什么是图?什么是极小连通子图?图是一种数据结构,由顶点集合V(非空)和边集合E构成,记为G=(V,E)。G即Graph图,V即Vertex顶点,E即Edge边。连通图可以理解为能够一笔画出来的图。而极小连通子图则是包含一个连通图的所有顶点(假设有n个),却只有(n-1)条边(这些边仍然属于E)的子图,并且这个子图仍然是...原创 2018-09-12 11:24:58 · 6873 阅读 · 1 评论 -
猴子分桃问题
任务:动物园里的n只猴子编号为1,2,3,...,n,依次排成一队等待分桃。分桃规则是每只猴子可分得m个桃子,但必须排队领取。饲养员依次拿出1,2,3,...,k个桃子放入筐中,由队首猴子领取。当取到k个桃子放入筐中后,下一次又重新从1个桃子开始取。当筐中桃子数加上队首猴子已取得的桃子数不超过m时,队首猴子可以全部取出筐中的桃子。取得桃子总数不足m个猴子,继续到队尾排队等候,当筐中桃子数加上队首猴...原创 2018-09-09 18:40:42 · 1394 阅读 · 0 评论 -
双栈模拟队列
栈是先进后出,队列是先进先出,因此若想用栈保存数据(stack1)获得正确的顺序,就要把栈的顺序反过来。可以把stack1中的数据逐个弹出至另外一个栈(stack2),这样就可以达到正确的队列顺序了值得注意的是,似乎在出队后需要将stack2的再逐个弹回stack1,实际上不用。在下一次出队时若stack2非空,直接从stack2去弹出;否则,再将stack1的元素全部弹出至stack2,然后...原创 2018-09-09 14:10:23 · 525 阅读 · 0 评论 -
多栈模拟问题
任务:模拟当前系统中各栈的工作转态输入:第1行是一个正整数n,表示n个栈操作。接下来n行,每行一个栈操作指令。"PUSH A B"表示将正整数B压入编号为A的栈顶,"POP A"表示弹出并输出栈A的栈顶元素,为栈为空则输出0不是什么特别难的算法,就随便写写了,关键在于栈的编号不是顺序的,而且也没有范围,所以考虑使用map来存储#include <iostream>#in...原创 2018-09-09 11:51:36 · 227 阅读 · 0 评论 -
单柱汉诺塔翻转问题
在一个塔座上有一叠大小不等的共n 个圆盘。各圆盘从小到大编号为1,2,……,n。初始时,这些圆盘自下而上散乱地叠在一起。现要求按照以下翻转规则,经若干次翻转,将塔座上的这一叠圆盘排好序,即按自底向上,从大到小的顺序叠置。 翻转规则:每次可以将最顶上的若干圆盘翻转,即按其相反的次序叠置。 例如,在下面的 3个圆盘叠置状态中,中间状态是在左边状态中第3 个圆盘以上所有圆盘翻转后得到的,相应翻...原创 2018-09-09 11:02:06 · 349 阅读 · 0 评论 -
车皮编序问题
数据结构栈的应用,依然是深搜,参考了别人的代码,但是关于out栈还是有点不太理解 #include <iostream>#include <stack>using namespace std;int n; //火车数量 int num; //调度方案数template <class T>void initStack(stack&l...原创 2018-09-09 00:47:18 · 465 阅读 · 0 评论 -
图的二着色问题
问题描述:对于给定的图G,如果存在一种用两种颜色对顶点着色的方案,使得图中任意一条边所连接的两个顶点着不同颜色,则称图G是可二着色的。实验任务:对于给定的图G,计算G是否可二着色数据输入:第1行有2个正整数m, n,表示给定图G有n个顶点和m条边,顶点编号1,2,...,n。接下来m行中,每行有两个正整数u,v,表示图G的一条边(u,v)结果输出:可二着色输出"Yes",否则输出"No...原创 2018-10-09 00:05:56 · 3681 阅读 · 0 评论