
数据结构的JAVA实现
数据结构的JAVA实现
Lasonas
这个作者很懒,什么都没留下…
展开
-
并查集及其应用(以POJ1611为例)
The Suspects POJ - 1611Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others原创 2020-08-24 12:08:57 · 221 阅读 · 0 评论 -
图的最短路问题之bellman-ford算法
bellman-ford算法: 遍历所有的边,边有起点i和终点j,如果源点到顶点的最短距离d[i]已经算出来,就比较d[j]和d[i]+distance,如果前者比后者大,就可以更新d[j],如此往复,直到没有数据可更新,这样源点到所有顶点的最短距离就算出来了。代码实现:import java.util.Arrays;public class Main { static int[][] graph = { {0, 2, 5, 0, 0, 0, 0},原创 2020-08-23 19:39:20 · 202 阅读 · 0 评论 -
最小生成树之Kruskal算法实现(基于并查集)
Kruskal算法简单易懂的描述: 假设有如下图: 将上图按边的权值从小到大排序: 按边的权值从小到大取边加入生成树,注意:最小生成树是不能有环的,所以每取一条边都要检查所取边的两个端点是否在之前取边时都取过,如果都取过则不能取该条边(需要继续往下检查看接下来的边能否取),如果只有一个端点曾经取过,那么这条边依然是可以加入生成树的。当取到的边总数等于顶点总数减1时,最小成生树就生成了。如图:代码实现:边集:/** * 边集的封装 * 边集可以用来表示图 * @param &原创 2020-08-23 17:45:20 · 371 阅读 · 0 评论 -
图的dfs_二分图着色
把相邻顶点染成不同颜色的问题叫做图的着色问题。对图进行染色所需的最小颜色数,称为最小着色数。 最小着色数为2的图称为二分图。 给定一个具有n个顶点的图,要给图上每个顶点染色,并且要使相邻的顶点的颜色不同、问能否最多用2种颜色进行染色?没有重边和自环。参考代码:import java.util.ArrayList;import java.util.List;//邻接表class GraphNode { public int val; private List<原创 2020-08-23 13:58:36 · 366 阅读 · 0 评论 -
图的dfs_欧拉道路(打印欧拉道路的路径)
欧拉道路和欧拉回路: 从无向图中的一个结点出发走出一条道路,每条边恰好经过一次,这样的路线称为欧拉道路。 如果一个无向图是连通的,且最多只有两个奇点(度数为奇数),则一定存在欧拉道路。 如果有两个奇点,它们必须是起点和,如果奇点不存在,可以从任意点出发,最终一定会回到该点,称为欧拉回路。参考代码:import java.util.Stack;public class Main { //在递归回溯时把路径依次存入栈中 static Stack<String>原创 2020-08-23 11:24:04 · 470 阅读 · 0 评论 -
图的dfs_拓扑排序(可以检测出图中是否有环)
图的dfs_拓扑排序(可以检测出图中是否有环)参考代码:public class Main { //顶点数 static final int n = 4; static String[] v = {"a", "b", "c", "d"}; static int[][] graph = { {0, 1, 0, 0}, {0, 0, 0, 0}, {0, 1, 0, 0}, {0原创 2020-08-23 00:09:02 · 626 阅读 · 0 评论 -
图的dfs_八连通检测(输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块)
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。 如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。参考代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int M = sc.nextInt();原创 2020-08-22 21:44:48 · 786 阅读 · 0 评论 -
图的dfs_四连通检测(判断图中的两点是否连通)
给定一个方阵,定义连通:上下左右相邻,并且值相同。可以想象成一张地图,不同的区域被涂以不同颜色。输入:整数N, (N<50)表示矩阵的行列数接下来N行,每行N个字符,代表方阵中的元素接下来一个整数M,(M<1000)表示询问数接下来M行,每行代表一个询问,格式为4个整数,y1,x1,y2,x2,表示询问(第y1行,第x1列) 与 (第y2行,第x2列) 是否连通。连通输出true,否则false例如:10001000000000111000000000111110原创 2020-08-22 14:11:20 · 1324 阅读 · 0 评论 -
二叉树中序遍历的递归和非递归形式
其实递归的本质就是入栈和出栈操作,模拟中序遍历时递归形式的栈操作,即可得到二叉树的非递归形式代码。 递归形式: private void inOrder(TreeNode<K, V> p, Consumer<K> con) { if (p != null) { //遍历左子树 inOrder(p.left, con); //处理根节点(处理方式也可以直接把值输出)原创 2020-08-20 09:20:29 · 235 阅读 · 0 评论 -
字典树(前缀树)的简单实现
实现类:public class Trie { private class TrieNode { //元素的序号 int level; //子节点信息 TrieNode[] children = new TrieNode[26]; //是否是最后一个节点 public boolean isLast; //出现的频率 public int fre = 1; }原创 2020-08-16 14:25:23 · 185 阅读 · 0 评论 -
二叉搜索树(Binary Search Tree)的JAVA实现
节点定义:public class TreeNode<K, V> { //关键字 public K key; //值 public V value; //左孩子节点 public TreeNode<K, V> left; //右孩子节点 public TreeNode<K, V> right; //父节点 public TreeNode<K, V> parent;原创 2020-08-14 17:41:03 · 466 阅读 · 0 评论 -
树的层次遍历(BFS宽度优先搜索)
思路:先把根节点root加进队列,然后遵循“队头弹出一个节点,队尾加入该节点的所有孩子,循环此操作直至所有节点都弹出”的规律,把弹出的节点依次存入结果列表,最后将列表返回。public class Main { public <E> List<List<TreeNode<E>>> levelOrder(TreeNode<E> x) { //存放结果的list List<List<TreeNod原创 2020-08-13 10:56:43 · 342 阅读 · 0 评论 -
树的JAVA实现
节点定义import java.util.List;public class TreeNode<E> { //数据 public E key; //父节点 public TreeNode<E> parent; //所有子节点 public List<TreeNode<E>> children; public TreeNode(E key, TreeNode<E> parent) {原创 2020-08-12 21:09:31 · 232 阅读 · 0 评论 -
十大经典排序算法
内容参考自https://www.runoob.com/w3cnote/ten-sorting-algorithm.html转载 2020-08-02 14:08:41 · 140 阅读 · 0 评论 -
双链表的java实现
线性表的接口定义/** * 线性表(列表)的接口定义 */public interface MyList { /** * 新增一个元素 * * @param element 要新增的那个元素 */ public void add(Object element); /** * 删除相同元素 * * @param element 要删除的那个元素 */ void delete(Object原创 2020-08-01 19:03:15 · 2349 阅读 · 0 评论 -
单链表的java实现
线性表的接口定义/** * 线性表(列表)的接口定义 */public interface MyList { /** * 新增一个元素 * * @param element 要新增的那个元素 */ public void add(Object element); /** * 删除相同元素 * * @param element 要删除的那个元素 */ void delete(Object原创 2020-08-01 14:30:34 · 191 阅读 · 2 评论 -
用java数组实现线性表的增删改查(可扩容)
基于数组实现线性表欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mark原创 2020-08-01 09:23:12 · 770 阅读 · 2 评论