数据结构
想进阿里的小菜鸡
小小菜鸡的进阶之路
展开
-
赫夫曼树的实现---Java
思路 对于传进来的数组首先将其存入到ArrayList中,便于后续的删除操作,对ArrayList进行排序,将最小的两个节点Node取出来,其值相加得到父节点的值,让父节点的左右孩子分别指向前两个元素,将当前ArrayList中的前两个元素删除,将父节点添加到ArrayList中,并且重复该操作,知道ArrayList的长度为1结束,当前ArrayList中的元素就是赫夫曼树的根节点,将其返回。核心代码public static Node HaffmanTree(int[] arr...原创 2021-12-11 15:02:35 · 378 阅读 · 0 评论 -
通俗易懂的堆排序---java实现
堆排序前提进行堆排序的数组是完全二叉树,本文章数组下标是从0开始计算的。如果第i个元素不是叶子节点,则其左孩子下标是i*2+1,右孩子下标是i*2+2; 当前数组中最后一个非叶子的下标是array.leng/2-1。如下图节点30是最后一个非叶子节点。生成大顶堆的思路1.从最后一个非叶子节点30下标为3开始,将其左右节点中最大的与30交换,然后去遍历上一个非叶子节点90其下标为2,直到遍历到最后一个接点50为止。2.当遍历到第二层的节点10时,其左右孩子中..原创 2021-12-10 21:16:26 · 515 阅读 · 2 评论 -
中序遍历线索二叉树---java
思路找到中序线索二叉树的第一个节点,并打印。从第一个节点开始,依次打印其后继节点。若没有后继节点就将其右孩子作为当前节点,继续遍历,直到节点为空,退出循环。代码head为二叉树的头结点//中序遍历线索二叉树 public void midOrder() { Hero2 node = head; while (node != null) { //找到中序线索二叉树的第一个节点,并打印 whil.原创 2021-11-30 10:01:05 · 705 阅读 · 5 评论 -
线索化二叉树
思路左边是原二叉树,线索化二叉树就是将二叉树中左右指针为空的地方指向其前驱和后继节点,变为右图的样子。代码核心方法://再遍历自身 //设置前驱节点 if (root.getLeft() == null){ root.setLeft(proNote); root.setLeftType(1); } //设置后继节点 if (proNote ..原创 2021-11-29 20:33:45 · 354 阅读 · 0 评论 -
前序遍历数组顺序存储的二叉树
代码地址https://gitee.com/ALi_L/javaDataStructurs.git思路数组是按照顺序存储的二叉树,要将数组看为一个二叉树进行前序遍历。如果当前节点在数组中的下标是i,则其左子节点的下标是2*i-1;右子节点的下标是2*n+2。代码package DataStructures.BinaryTree;/** * @author :ALi * @date :Created in 2021/11/28 20:44 * @description:顺序存储二叉原创 2021-11-28 20:59:30 · 752 阅读 · 0 评论 -
前序删除二叉树节点----java
思路删除节点,如果节点为叶子节点就直接删除,如果不是叶子节点就将整颗树删除代码在二叉树类中判断当前节点和删除的节点是否相等,相等就直接置为空,在节点类Hero中就是判断左边孩子和右边孩子是否为要删除的节点。public void del(int no){ if (this == null){ return; } if (this.head.getId() == no){ this.head =原创 2021-11-27 21:07:13 · 355 阅读 · 0 评论 -
二叉树的前序、中序、后序查找---Java递归实现
与前序、中序、后序遍历的思路一样的,只是多了一个判断而已!可以看我前中后遍历的代码二叉树遍历https://blog.csdn.net/weixin_56640241/article/details/121459472?spm=1001.2014.3001.5501前序查找//前序查找 public Hero preFind(int no){ Hero res = null; if (this.id == no){ retu..原创 2021-11-21 21:22:06 · 427 阅读 · 0 评论 -
二叉树的前序、中序、后序遍历----递归实现
注:left是左节点值;right是右节点值。三种遍历的不同是父节点的遍历位置不同名字而不同前序遍历:先父节点->左子节点->右子节点public void preOrder() { System.out.println(this);//父节点 if (this.left != null) { this.left.preOrder();//左子节点 } if (this.right != nul.原创 2021-11-21 20:33:15 · 633 阅读 · 0 评论 -
用数组栈来实现多位数计算器---java版
用数组实现个位数计算器在上一篇的基础上进行了改进,可以实现多位数计算器的计算并且无Bug。只在判断是数字的部分将numberStack.push(ch);改为下面的,//改进为可以计算多位数 keepNum+=ch; if (index == str.length()-1){ numberStack.push(Integer.parseInt(keepNum)); .原创 2021-11-04 15:14:31 · 462 阅读 · 0 评论 -
用数组+链表实现哈希表
代码地址https://gitee.com/ALi_L/javaDataStructurs.git目录思路图解如下各个代码整体代码思路用链表来存储数据;Emp 用数组来存放一个一个的链表;EmpLinkedList 再用一个类来管理数组。HashTab图解如下各个代码1.节点Empclass Emp { private int id; private String name; public Emp next; public..原创 2021-11-21 15:35:53 · 779 阅读 · 0 评论 -
插值查找(在数据是差值排序的时候比二分快)
代码地址https://gitee.com/ALi_L/javaDataStructurs.git思路就是在二分查找的基础上,将mide修改为下面的:int mide = left + (right - left) * ((findValue - array[left]) / (array[right] - array[left]));这个地方是与二分查找的不同地方。将mide设置为在数组中相对的位置。很好理解的整体代码package DataStructures.Se.原创 2021-11-20 16:21:50 · 198 阅读 · 0 评论 -
二分查找(包含多个位置)
代码地址https://gitee.com/ALi_L/javaDataStructurs.git思路查找有序的数组中对应的数字,先查找数组中间的数字是否相等,相等就返回位置,不等就分左右两边依次查找,直到左下标大于右下标时结束。(这个是最终的退出条件,左下标大于右下标只有没找到才会,不懂的话就用两个数字的数组画下图就知道了)代码package DataStructures.Search;import java.util.ArrayList;import java.util.List原创 2021-11-20 15:12:29 · 263 阅读 · 0 评论 -
基数排序----java
桶排序思路将数组中的数字按照个位数放入相应的桶中,桶从0~9开始排序,放入后再一次从桶中将数据放回到原始数组中; 将数组中的数字按照十位数放入相应的桶中,桶从0~9开始排序,放入后再一次从桶中将数据放回到原始数组中; 直到最大的数的位数放完为止,位数不够的数字在前面补0; 然后将最后的桶中的元素一次放回原始数组中。代码public static int[] sort(int[] array){ //定义桶,bucket[i][j]表示第i个桶的第j个元素原创 2021-11-18 21:46:43 · 418 阅读 · 1 评论 -
归并排序---java实现
思路核心是分治算法。 先将数组分开,分为一个元素一个数组。 最后将数组合并为一个数组。 将每个数组中较小的放到临时数组中,如果一个数组全部放入临时数组后,就将后面的一个数组全部放入临时数组;最后将临时数组放进到原始数组中。gitee地址归并排序https://gitee.com/ALi_L/javaDataStructurs.git代码package DataStructures.sort;import java.util.Arrays;/** * @author :AL原创 2021-11-11 22:04:17 · 205 阅读 · 0 评论 -
快速排序---java
目录思路gitee地址:代码思路找到数组中间的节点pivot 从左边找比pivot大的数与其右边比pivot小的数交换 然后pivot左边的数字在进行快速排序,右边也进行快速排序,最后就可以了。gitee地址:快排https://gitee.com/ALi_L/javaDataStructurs.git代码package DataStructures.sort;import java.lang.reflect.Array;import java.uti...原创 2021-11-11 20:50:04 · 362 阅读 · 0 评论 -
希尔排序---插入排序
原理和这个一样希尔排序,但是时间比交换排序实现的快很多!注:这个只是在最内层循环没有用交换而是用的插入排序package DataStructures.sort;import java.util.Arrays;/** * @author :ALi * @date :Created in 2021/11/9 21:27 * @description:希尔排序---插入法 * @modified By: * @version: $ */public class ShellSor.原创 2021-11-09 21:49:13 · 352 阅读 · 0 评论 -
希尔排序---交换实现
思路:这个是尚硅谷Java数据结构课上的思路。这个地方老师讲的不好。分组后每组的交换要考虑到组中最后一个元素与同组其他元素的比较,所以最里面的for循环才这样写,而不是就执行一次,这个for循环是精髓。package DataStructures.sort;import java.lang.reflect.Array;import java.util.Arrays;/** * @author :ALi * @date :Created in 2021/11/9 20:47 ..原创 2021-11-09 21:11:55 · 572 阅读 · 0 评论 -
插入排序(两个for循环实现)---java
目录项目思路:gitee地址项目代码:插入排序函数sort(int[] array)总体代码项目思路:1将数组分为两部分看待,一部分是排序后的数组,一部分是要插入到排序后数组的元素。默认按从小到大排序2将要插入的数据x,以其前面的有序数据一次进行比较,如果有序数据大于数据x,则有序数据一次后移一位,空出一个位置使x插入,这个位置前面的数据都比x小,后面的都比x大。注:一次后移比较重要gitee地址插入排序项目代码:插入排序函数sort(int[] arra原创 2021-11-08 09:33:08 · 584 阅读 · 0 评论 -
选择排序---java
目录目录:项目思路:项目用到的图片/gitee地址项目代码:类名:SelectSort()整体代码:项目思路:1先从第一个元素开始与后面的每个元素比较,如果后面有比当前元素小的,则保存其下标,直到本次循环结束后,再去交换元素,这样就会比冒泡排序减少交换次数,提高了代码的运行速度。2.需要有一个标志位来判断这次内层循环是否是找到了最小的元素,可以用最小元素的下标来替用。项目用到的图片/gitee地址SelectSort项目代码:类名:SelectSort原创 2021-11-07 20:37:01 · 72 阅读 · 0 评论 -
冒泡排序---java
项目思路:1将紧邻的两个数字进行比较,然后焕位置,然后两个指针都向后移动一个,不要和别的排序弄混。gitee地址冒泡排序项目代码:sort是排序的函数注解:该代码还可以优化。public static void sort(int[] array){ int temp = 0; for (int i = 0;i<array.length;i++){ for (int j = i+1;j<array.lengt原创 2021-11-07 17:37:26 · 76 阅读 · 0 评论 -
八皇后问题---java
目录项目思路:项目的gitee地址项目代码:judge()判断第n个皇后和前面的皇后是否冲突check(n)从第n个皇后开始放置到棋盘上:show()打印数组总体代码项目思路:1.用一维数组来表示放置皇后的位置如array[0] = 1表式棋盘的第0行第1列放置了一个皇后。可以在判断是否在一条斜线上更简单,还自动排除了两个皇后在同一行。2.分两步走,第一步先判断第n个皇后的位置是否和前面n-1个皇后的位置冲突3.第二步,从第n个皇后开始放到棋盘上,判断有几种有原创 2021-11-07 11:41:11 · 116 阅读 · 0 评论 -
递归解决迷宫问题---java
目录递归思路:gitee地址项目代码:生成墙:找路:setWay(int[][] map,int i,int j)查看结果输出结果:总体代码如下:递归思路:1.递归必须要明确什么条件调用,什么条件结束。2.递归必须向递归结束的方向逼近,否则就是死循环了。3.遵循谁调用就将结果返回给谁。gitee地址maze文件项目代码:生成墙:注解:墙如下所示 1 1 1 1 1 1 1 0 0 0 0原创 2021-11-06 21:00:38 · 154 阅读 · 0 评论 -
中缀表达式转为后缀表达式---java版
目录项目思路:项目用到的图片/gitee地址项目代码:方法名:toInFixExpressionList方法名:pareseSuffixExpreesionList判断优先级:Operation整体代码:项目思路:1.将数学式子变为list为后面的做准备2.将中缀的list按照要求转换为后缀表达式项目用到的图片/gitee地址中缀表达式转后缀表达式项目代码:方法名:toInFixExpressionList注解:将转为list形式的中缀表达式原创 2021-11-06 15:38:26 · 259 阅读 · 0 评论 -
逆波兰计算器实现1.0版
说明:(3+4)*5-6的逆波兰数是"30 4 + 5 * 6 -",然后对其逆波兰数进行计算项目地址:java数据结构与算法: 自己学习与练习数据结构的仓库https://gitee.com/ALi_L/javaDataStructurs.git1.用getListString()方法将"30 4 + 5 * 6 -"按照空格切分。/** * create by: ALi * description: 分隔字符串 * create time: 2021/.原创 2021-11-04 20:22:41 · 84 阅读 · 0 评论 -
用数组栈来实现个位数计算器---java版
目录项目思路:项目用到的图片/gitee地址项目代码:判断优先级的方法:判断优先级进行计算,并返回结果main方法中的代码项目思路:1.通过index来遍历输入的表达式,将数字和+-*/分开2.如果用index发现的是数字则直接进入数栈numStack3.如果index扫描到一个符号,就分为如下情况:3.1如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或等于栈中的操作符,就需要将numStack中pop出两个数字,并将符号栈弹出一个符号进行计算,原创 2021-11-03 09:32:49 · 98 阅读 · 0 评论 -
数组实现栈---[java版]
目录项目简述:项目用到的图片/gitee地址项目代码:ArrayStack栈类出栈方法pop入栈的方法push遍历栈的方法list()测试以上的功能用main()项目简述:1.用数组的形式来模拟栈,入栈后的元素依然保存在数组中,无法真正的删除,但是用链表模拟栈时出栈就可以删除掉元素。2.定义的stact类(栈类):最大尺寸、数组、栈顶指针初始化为-1。3.实现起来很简单,不难。项目用到的图片/gitee地址Stack文件夹项目代码:原创 2021-11-02 16:12:45 · 291 阅读 · 0 评论 -
约瑟夫环Josepfu---[java实现]
项目概述:1.增加节点2.遍历节点3.从指定位置开始,隔n个人出圈一个人,最后圈中剩一个人项目整体代码在gitee上JosepfuList.java约瑟夫环项目代码:节点定义:注解:1.在刷题时,节点已经定义好了,不用看下面的代码。注解:2.将no和next设置为private是为了体现封装性。class Boy{ private int no;//序号 private Boy next; public Boy(){ .原创 2021-11-01 11:13:39 · 71 阅读 · 0 评论 -
单链表倒序输出Java版
使用头插法实现带头结点的单链表倒序输出HeroNode是节点类。最重要的是要用一个节点next来存放当前节点的下一个节点的数据,不然链表会断开/** * * @param head 原节点的头 */ public void returnHeroNode(HeroNode head){ //判断原链表是否为空 if (head.next == null || head.next.next == null){ ..原创 2021-09-20 14:12:53 · 545 阅读 · 0 评论 -
单链表的增、删、改、查(尚硅谷Java数据结构与算法)
单链表的按顺序插入与展示。整个代码在最后,gitee地址:链表操作的核心是:1.有了头结点,整个链表就都知道了。2.插入节点要把前一个节点断开,新节点指向后一个节点因此对于链表问题,就是要把头结点赋值给中间变量,用中间变量来进行操作,可以保证原链表不修改。如果直接用头结点head啦修改链表就好破坏原来的链表。说明:class HeroNode是节点类,定义了节点的属性和方法,重写toString 方法是为了打印节点。/** * 节点类 */class He.原创 2021-09-12 21:14:02 · 170 阅读 · 0 评论 -
用数组实现环形队列(尚硅谷Java数据结构与算法)
整个代码在文章最后面,gitee地址:java数据结构与算法: 自己学习与练习数据结构的仓库https://gitee.com/ALi_L/javaDataStructurs.git环形队列的难点如下:1.如何判断队列已经满了2.如何判断队列是空的3.如何打印队列4.如何增加一个元素到队列解决方法:首先用front指向队列的首元素地址,用rear指向队列最后一个元素后面的地址,队列的属性如下:。 private int maxSize; private int原创 2021-09-12 16:38:30 · 515 阅读 · 1 评论 -
用数组实现非环形队列(尚硅谷Java数据结构与算法)
gitee链接:java数据结构与算法: 自己学习与练习数据结构的仓库整个代码在最后,下面的是部分代码用一个类QueueDemo来定义队列的属性+方法/** * 创建队列类 */class QueueDemo{ private int MaxLength; //最大长度 private int front; //队列的头结点 private int rear; //队列的尾结点 private int[] array;// 队列存储数据的数组原创 2021-09-12 11:17:36 · 92 阅读 · 1 评论 -
稀疏数组的实现(尚硅谷Java数据结构与算法)
整个代码放在main函数中就可以运行从数组---->稀疏数组int arrays[][] = new int[11][11]; arrays[1][2] = 1; arrays[2][3] = 2; //打印初始化的数组 for (int i = 0;i<arrays.length;i++){ for (int j = 0;j<arrays[i].length;j++){原创 2021-09-09 21:34:19 · 92 阅读 · 1 评论