数据结构
Be_With_I
这个作者很懒,什么都没留下…
展开
-
图的广度遍历
广度遍历和深度的区别首先遍历自身可以到的所有节点。所有节点都是先进队列,然后出队列,才使用。队列用于控制外层的循环二,通过队列保存住已经遍历过的节点。当第一个节点的所有相关节点遍历之后,我们继续用队列,拿出一个,和第一个一样的用法。这样,一次可以遍历最多的节点,如果没有完全的遍历到。我们会用最外层的循环,继续遍历 public void bfs(int n){ Linke...原创 2020-03-26 21:31:56 · 488 阅读 · 0 评论 -
图的深度遍历
深度遍历就是从A开始找到它连接的第一个顶点。从顶点 访问 当前的下一个顶点。也就是一直往下。有点像迷宫的问题。也就是试验,先打印a能到的最远距离。然后从第二个点开始,如果已经打印过了,就不打印了。但是如果没打印,就从当前再找到最远的距离。//得到这个节点的下一个节点。 public int getFir(int index){ for (int i = 0; i ...原创 2020-03-26 16:02:33 · 228 阅读 · 0 评论 -
图的引入
前面我们处理了线性结构,也就是链表和树但是他们都只有一个前驱节点。但是。如果是想要多对多的问题。无法满足。图结构举例:比如地铁的地图图的一些属性:1,顶点2,边3,路径 DBC DABC4,无向图 AB之间没有箭头的指向。5,有向图。 AB之间有箭头了6,带权图。 也就是北京到上海的距离 1000km 这种也叫做网。图的表现方式。用二维数组。值来标识,链接...原创 2020-03-26 10:45:25 · 133 阅读 · 0 评论 -
B树的引入
因为二叉树在海量数据的情况下,比如1亿。会出现创建缓慢,磁盘io次数过多的问题。所以引出的2-3树,也就是最简单的B树满足条件1,所有的叶子节点都在同一层。2,有两个节点的节点叫做2节点。要么没有节点,要么有两个节点。3,三节点和上面的2节点要求一样。2-3树就是有2节点,和三节点构成的。B+tree 就是叶子节点变成了链表。...原创 2020-03-24 10:43:07 · 166 阅读 · 0 评论 -
平衡二叉树的引入
如果出现了一个1-2-3-4-5-6-7 这样的一个二叉树,在插入的时候,速度没有影响但是在查找的时候,比单链表还要慢。因为他要判断左子树。所以引出了平衡二叉树...原创 2020-03-23 10:06:27 · 195 阅读 · 0 评论 -
二叉树删除的问题
}else{ if (search.left != null) {//这一步确定了后边的值 if (pa != null) { if (pa.left != null) {//这一步确定了前面的值 pa.left = search.left; ...原创 2020-03-11 13:50:07 · 158 阅读 · 0 评论 -
二叉树删除节点的另两种情况
有两个子节点的是特殊情况。只是值得变化。在特殊情况下,我们需要删除的是最小的那个节点。并且把要删的节点的值给改成最小的值。因为之前的连接顺序都是对的,所以没必要改变。 public int findMin(Nod nod) { Nod temp = nod; while (temp.left != null) { temp = temp...原创 2020-03-11 13:04:52 · 140 阅读 · 0 评论 -
二叉排序树的叶子节点的删除
这里面有个特殊情况,就是查找的节点就是root节点。它也是个叶子节点。那么直接 null,而且这种情况必须先判断。否则后序会报错public void del(int value) { if (root == null) { return; } Nod search = root.search(value); ...原创 2020-03-07 09:49:08 · 451 阅读 · 0 评论 -
二叉排序树的删除准备
我们先要找到要删除的节点,以及父节点。因为我们要再删除之后,将剩下的节点拼接。所以要判断父子关系 public Nod searchParent(int value) {//因为我们处理都是以一棵树为单位的,下一次处理肯定是他的子节点,所以往那边走我们需要判断是当前的。 if (this.left != null && this.left.value == ...原创 2020-03-07 09:20:51 · 95 阅读 · 0 评论 -
二叉排序树的创建和查看
这次主要用的是中序遍历。正好是从小到大的遍历。添加也是根据比较添加到排好序的位置package a;public class BinarySortDemo { public static void main(String[] args) { int[] arr = {8, 4, 11, 17, 6, 3, 10}; BinarySort tree =...原创 2020-03-06 21:24:10 · 139 阅读 · 0 评论 -
二叉排序树。我们之前的huffmanTree 并没有解释 树对于数组或者说链表的优势
二叉排序树的特点是 左边小于 上边,上边小于右边。如果有相同的数据:其实可以挂在左边或者右边。结论是 左边不能大于上边。右边不能小于上边。这种有序的二叉树。在查找位置的时候,相当于用了二分查找。在插入的时候,也不会影响其他节点。直接加上,删除需要处理的也不多和链表相似。所以其效率很高。...原创 2020-03-06 21:22:15 · 131 阅读 · 0 评论 -
hufmanTree 压缩的总结
像ppt 和视频文件,自身已经压缩过了。所以压缩率很低。还有就是压缩是二进制的压缩。所以,一切类型的东西都可以压缩。字节的处理。如果压缩的文件的重复率不高,那么压缩率很低。整体流程第一:变成map ,为了统计第二: 将统计的数据放在对象中。变成list ,为了排序第三:创建哈夫曼树。第四:通过树变成编码。对应关系用map存第五:通过编码。生成一个 二进制的String第六:...原创 2020-03-06 16:11:32 · 144 阅读 · 0 评论 -
利用hufffmanTree 进行图片的压缩和解压
主要用到的是ObjectInputStream ,装饰器模式的应用 private static void zip() throws Exception{ String srcPath ="d:\\2.jpg"; String desPath ="d:\\ccccc.zip"; InputStream is = new FileInputS...原创 2020-03-06 11:23:10 · 202 阅读 · 0 评论 -
humanTree进行解码,先将byte还原成二进制String 然后,解码查找
二进制的处理比较复杂,需要熟悉二进制,解码的过程就是编码的逆过程,因为用到map 所以也要逆变一下。第一步代码 private static String toBinaryString(boolean flag,byte encode) {//这个方法涉及到二进制的问题,和数据结构无关 int temp = encode; if (flag) { ...原创 2020-03-05 22:13:44 · 143 阅读 · 0 评论 -
生成hrffmanTree 以及利用huffmanTree的编码,对原byte[]进行编码
从前一步我们得到了每个字母对应的编码。然后遍历原始的数组,找到对应的编码 private static byte[] encode(byte[] bytes, HashMap<Byte, String> codes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { ...原创 2020-03-05 10:58:37 · 136 阅读 · 0 评论 -
HuffmanTree 的应用,将字符串转成huffmanTree
注意属性的类型,注意返回值得作用package a;import java.util.*;public class HuffmanStringDemo { public static void main(String[] args) { String content = " i learn learn learn english and you you you";...原创 2020-03-04 10:16:31 · 121 阅读 · 0 评论 -
hufmanTree 赫夫曼树简单介绍 以及创建
如果将树的根节点设置为第一层 ,那么路径到第n层 ,就是n-1的路径长度。什么是节点的权。就是节点的值是什么。第一步可以得到路径的长度第二步可以得到路径的权第三部得到带权的路径 也就是 1,2 的结果相乘。一棵树的叶子节点的代全路径的值最小,就是 huffmanTree 也叫最优二叉树。什么是最简单的二叉树,也就是没有任何一个子节点。...原创 2020-02-28 15:52:29 · 313 阅读 · 0 评论 -
大顶堆和小顶堆
其实大顶堆就是arr[n]>=arr[2n+1] && arr[n]>=arr[2n+2] 这个就是利用数组存储树的条件。小顶堆是把 > 换车<即可。原创 2020-02-26 17:41:04 · 371 阅读 · 0 评论 -
线索化二叉树
也就是前驱节点和后继节点的问题因为最初的节点是通过后一个找到的。也就是递归这么个逆序所以最初的节点并不知道自己后边的节点是谁然后我们通过一个辅助变量pre 前一个节点来记录当执行到后一个节点的时候。我们可以找到前一个,也就是在后一个节点中执行。将pre 初始化为全局的 null第一个的前一个是没有,然后第一个执行,每一个节点知道自己的前一个节点谁。所以在所有的关键在于这个pre pr...原创 2020-02-20 23:35:35 · 120 阅读 · 0 评论 -
顺序存储二叉树
就一层一层,从左到右的添加到数组,但是遍历的时候还能实现原来二叉树的前序,中序,后序的遍历这就要求有一个数组下标和二叉树左右节点的对应关系。2n+1 n是下标, 结果是下标位置元素的左子节点。 都是操作数组的下标父节点是 (n-1)/2package a;public class ArrayTreeDemo { public static void main(String...原创 2020-02-20 15:04:18 · 112 阅读 · 0 评论 -
二叉树的简单删除
public void del(int no) { if (root == null) { System.out.println("is null"); }else { if (root.no == no) { root=null; }else { ...原创 2020-02-20 11:10:09 · 193 阅读 · 0 评论 -
二叉树的前序,中序,后序查找
主要还是对递归的理解,查找和遍历都是用了两个递归,递归的查找总是先查找一个节点的最左边节点。每次递归都会打印左右两边的节点。其实有点像while循环,但是一个递归的方法中还包含着另一个递归。按照顺序执行package a;public class BinaryTreeDemo { public static void main(String[] args) { Her...原创 2020-02-19 10:21:09 · 208 阅读 · 0 评论 -
二叉树的前,中,后序遍历
二叉树有跟链表相似的地方。也是要用到节点。前,中,后,是以自身的打印顺序为标准的。打印利用了递归。递归退出的条件就是没有连接的节点了 ,也就是左边和右边都没有,然后退出。 前序遍历就是先打印,并不用等弹栈中序呢,等到一个节点没有左边,开始打印自己,然后看相邻的另一个,另一个也是要等到左边没有才能打印自己。最终的一个只是打印自己,退出的条件决定的是,左边的先被打印,递归的方法就是决定次序。 ...原创 2020-02-18 22:02:29 · 90 阅读 · 0 评论 -
二叉树的简介
因为数组在检索 某个值 效率很低或者是按照顺序插入某个值得时候,会整体移动 效率低链表的方式,插入某个值,删除都很快,但是检索一样很慢在有序的情况下,这两种在检索都很慢因此衍生出二叉树,来解决这个问题。节点:就是每一个对象的名称。根节点:叶子节点 : 一个是最初的,一个是最终的父节点和子节点 也是相对的。层路径 就是路线二叉树 也就是每个节点最多2个子节点满二叉树...原创 2020-02-18 15:14:01 · 190 阅读 · 0 评论 -
自己实现hashTable
员工作为节点。然后建立链表。 存的数据是员工。所有的方法是链表的方法,数组只是调用。hash中只有一个是自己实现的就是index 散列。package a;import java.util.Scanner;public class MyHashTableDemo { public static void main(String[] args) { MyHashT...原创 2020-02-18 11:18:57 · 220 阅读 · 0 评论 -
八皇后问题
递归的关键是每个方法的变量是独立的,也就是当第一次满了之后,最后的一个方法结束,栈中消失之前的方法继续运行,找到调用自身的方法,继续向下执行。进入下一次循环,列+1了。最后一次找到第一个就会推出的。然后回到上一次,继续试,其实都没有合适的。知道回到第二行才有。package a;public class Queen { public static void main(String[...原创 2020-02-09 23:38:29 · 185 阅读 · 0 评论 -
迷宫问题
递归负责寻找路的尽头,退出的条件是 找到。 如果没找到一直向后走,递归找,或者说路都走过了,也是返回falsepackage a;import java.util.Arrays;public class Maze { public static void main(String[] args) { int [][] arr = new int[8][7]; ...原创 2020-02-09 16:59:53 · 250 阅读 · 0 评论 -
对递归调用的理解
没每一块每个方法 也就是每一块在栈中都会有一个空间,空间中的n 是独立的。每次的调用自身,也就相当于暂停,等方法中真正有效的代码执行之后,继续其实方法中的判断条件就像是while中的判断条件一样。只不过参数是逆序的递归最好的理解方式就是拼接,想想String。package a;public class Self { public static void main(Strin...原创 2020-02-08 22:28:45 · 212 阅读 · 0 评论 -
利用栈 reverse polish 终追变后缀表达式 计算 02
主要的规则,一个是遇到) 将 sta中( 之前的符号全部弄到list中。如果 sta中的符号比新的符号大 或者是 = 都要讲sta中的符号弄到list中 用while最后将新的符号弄到sta中package a;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.List;impor...原创 2020-02-08 21:32:07 · 143 阅读 · 0 评论 -
用栈实现计算器01
先将字符串保存在容易遍历的list中,可以处理多位数字package a;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.List;public class TransDemo { public static void main(String[] args) { ...原创 2020-02-08 10:57:18 · 154 阅读 · 0 评论 -
利用栈 逆波兰表达式计算
主要思路就是把数放进栈中,如果遇见符号我们就计算,计算后数还是要放入栈,不保存符号在这里插入代码片package a;import java.util.Stack;public class CalDemo { public static void main(String[] args) { String expr = "3 4 + 5 * 6 -";//(3+4)...原创 2020-02-06 15:30:25 · 147 阅读 · 0 评论 -
栈表达式:通过用字符串来处理,可以实现多位数的计算
}else {//处理数字 do{ whole = whole+chars[i]; if(i==chars.length-1){break; } i++; } ...原创 2020-02-06 00:17:25 · 199 阅读 · 0 评论 -
利用栈来实现简单的表达式计算
class Sta{ public static void main(String[] args) { Sta sta1 = new Sta(10); Sta sta2 = new Sta(10); String expr = "3+2*6-2"; char[] chars = expr.toCharArray(); ...原创 2020-02-05 23:32:48 · 341 阅读 · 0 评论 -
栈的模拟
特点:先进后出,也就是比队列要更简单,用一个索引就ok了,栈的打印也是按照其特点来打印的。package a;import java.util.Scanner;public class StaDemo { public static void main(String[] args) { Sta sta = new Sta(2); String w...原创 2020-02-04 22:31:29 · 150 阅读 · 0 评论 -
丢手帕问题,单向环形链表
public void jump(int start,int num,int total){ if (start > total || first == null || start < 1) { System.out.println("不合法"); return; } //找到结束点 ...原创 2020-02-04 15:45:24 · 93 阅读 · 0 评论 -
单向环形链表(添加,和遍历)
重要的三个参数 first 记录开始位置,temp 记录最后位置, temp为了连接后边节点,first 用于最后节点形成环package a;public class CirListDemo { public static void main(String[] args) { CirList cirList = new CirList(); cir...原创 2020-02-04 10:56:43 · 221 阅读 · 0 评论 -
双向链表
和单向链表的主要区别在于删除,其他都是差不多的,就是需要后一个节点把pre和当前节点关联上//双向链表没有必要招自己的后一个节点了。直接找自己,然后删除就ok了 public void del(_Node hero) { _Node temp = head.next; while (temp != null) { if (temp....原创 2020-02-04 00:08:51 · 108 阅读 · 0 评论 -
链表的相关问题
1.单链表的有效节点个数 public static int length(_Node head) { _Node temp = head; int count = 0; while (temp.next != null) { count++; temp = temp.next; }...原创 2020-02-03 21:33:17 · 175 阅读 · 0 评论 -
链表的更新以及删除
public void del(_Node hero) { _Node temp = head; while (temp.next != null) { if (temp.next.no==hero.no) { temp.next = temp.next.next; } ...原创 2020-02-03 17:53:08 · 757 阅读 · 0 评论 -
链表 添加 遍历 (有序添加,重复过滤)
class _List{ private _Node head = new _Node(0, "", ""); public void add(_Node node) { _Node temp = head; while (true) { if (temp.next == null) {//当前的next这个属性是不是nul...原创 2020-02-03 10:54:58 · 290 阅读 · 0 评论