数据结构
文章平均质量分 94
常见数据结构与算法原理及实现
暗黑大型犬
这个作者很懒,什么都没留下…
展开
-
JAVA代码实现字符串匹配(一)——BF、KMP
话不多说,直接进入主题: 题目描述:给定两个字符串text和pattern,请你在text字符串中找出pattern字符串出现的第一个位置(下标从0开始),如果不存在,则返回-1; LeetCode字符串匹配的题目:https://leetcode-cn.com/problems/implement-strstr/ 举个例子:字符串tex原创 2021-06-02 15:21:18 · 2153 阅读 · 0 评论 -
JAVA代码实现平衡二叉树
平衡二叉树平衡二叉树又叫AVL树,它是在二叉排序树的基础上进行了树结构的调整,使其根节点的左右子树的高度差一致。可以保证查询效率更加高效。平衡二叉树涉及到左旋转、右旋转和双旋转,接下来分别用图解分析一下:左旋转右旋转双旋转代码如下:package com.avl;/* * 平衡二叉树: * 1.左旋转 * 2.右旋转 * 3.双旋转 */public class...原创 2020-03-22 11:54:38 · 1239 阅读 · 2 评论 -
JAVA代码实现二叉排序树的创建和删除
二叉排序树的创建和删除最近学习了二叉树的创建和删除功能,本文代码主要实现以下功能:给定一个数列,创建二叉排序树(BST)遍历二叉排序树(中序遍历)删除二叉排序树的节点其中,二叉排序树的删除节点步骤较为繁琐,思路总结如下:一.如果要删除的节点是叶子节点1.找到要删除节点:targetNode;2.找到要删除节点的父节点:parent;3.判断要删除的节点是其父节点的左子节点还...原创 2020-03-21 15:28:37 · 258 阅读 · 0 评论 -
JAVA代码创建哈夫曼树
哈夫曼树最近学习了数据结构中哈夫曼树的知识。先来看哈夫曼树的定义:给定n个权值作为叶子节点,构造一棵二叉树,如果该树的带权路径长度(WPL)达到最小,则称这样的二叉树为最优二叉树,也称为哈夫曼树。得明确几个重要的概念:路径和路径长度:在一棵树中,从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到第L层节点的路径长...原创 2020-03-15 16:23:13 · 303 阅读 · 0 评论 -
JAVA代码实现堆排序
堆排序最近学习了堆排序算法。堆排序是一种选择排序,是不稳定的排序,其最坏、平均、最优时间复杂度都为O(nlogn)。堆排序逻辑上是利用完全二叉树对数进行移动,实际是对数组进行操作。堆排序算法的基本思路:根据升序或降序将数组逻辑上转换成大顶堆或小顶堆;将根节点的数和最后的数交换位置,“沉”在数组的最后,然后继续调整成大顶堆/小顶堆;反复执行步骤2,直至结束。看了上述步骤之后可能会有这...原创 2020-03-14 16:27:38 · 159 阅读 · 0 评论 -
JAVA代码实现前序和中序线索二叉树的
前序、中序线索化二叉树最近学习了线索二叉树的相关知识。并且用代码实现了前序和中序的线索化二叉树的构建和遍历。具体步骤已在代码中说明。后序线索化二叉树目前还在研究阶段。。。代码中如果有解释错误的地方,还望指出,定会及时改正。package com.tree.binnaryTree;public class ThreadBinnaryTreeDemo4 { public static v...原创 2020-03-08 20:42:25 · 174 阅读 · 0 评论 -
JAVA代码实现二叉树的前序、中序、后序遍历
二叉树的遍历二叉树的遍历分为前序、中序和后序。可以通过遍历父节点的顺序来区别。前序遍历的顺序是父节点–左子节点–右子节点;中序遍历的顺序是左子节点–父节点–右子节点;后序遍历的顺序是左子节点–右子节点–父节点。通过递归的方式可以将其实现。我主要写了以下几个方法二叉树的前序、中序和后序遍历;按节点编号顺序插入节点;根据编号前序、中序和后序查找对应的节点package com.tree....原创 2020-03-02 18:59:19 · 839 阅读 · 0 评论 -
JAVA代码实现哈希表
哈希表哈希表也叫散列表,是根据关键码值而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。举例:定义一个哈希表实现员工的增删改查package com.hashTab;import java.util.Scanner;/* * 使用哈希表完成员工的增删改查 */public class ...原创 2020-03-01 15:34:59 · 323 阅读 · 0 评论 -
JAVA代码实现二分查找和插值查找
二分查找二分查找,顾名思义就是折半查找。前提是数组必须是有序的。每次将查找的数和数组的中间值进行比较,如果要查找的数比中间值小就左递归继续查找,如果要查找的数比中间值大,就右递归继续查找,如果要查找的数存在,最终就是反复递归后的中间值。package com.search.BinarySerach;import java.util.ArrayList;import java.util.L...原创 2020-02-29 15:10:03 · 166 阅读 · 0 评论 -
JAVA代码实现基数排序
基数排序基数排序是经典的拿空间换时间的排序算法。当预排数据中有重复数据时,该算法排完序后,重复数据的相对顺序仍然不变,即表明基数排序是一种稳定排序算法。其基本思想如下:第一轮按每个数的个位数的顺序,将数放入0-9的10个桶中,然后按顺序取出来放回原数组;第二轮按每个数的十位数的顺序,将数放入0-9的10个桶中,然后按顺序取出来放回原数组;依次类推。其代码步骤如下:得到数组中最大数的位数,确...原创 2020-02-27 15:37:12 · 266 阅读 · 0 评论 -
JAVA代码实现归并排序
归并排序归并排序用到了分治法的思想。用代码实现时,按从小到大排序为例,主要的思路分为分解和合并两大步骤:分解:第一次分解时,根据数组的头尾下标,得出分界线的位置,即:mid=(left+right)/2;向左递归分解:就是将数组的头下标和分界线的下标当做新序列的头尾下标再次分解;向右递归分解:就是将分界线的下标后一位(mid+1)和数组的尾下标当做新序列的头尾下标再次分解;分解结束后...原创 2020-02-27 11:44:08 · 163 阅读 · 0 评论 -
JAVA代码实现快速排序
快速排序快速排序是一种改进版的冒泡排序。针对一组数据,按从小到大排序为例。首先随机选取一个数为基准(一般选取第一个数或者中间数)然后将数据分成左右两组,左边的每个数据都比基准小,右边的每个数据都比基准大。其实现思路是:首先确定基准,然后确定左指针和右指针;右指针先往左移动,找出比基准小的数的下标;当右指针找到比基准小的数时,左指针开始向右移动,找到比基准打的数的下标;如果左指针和右指针...原创 2020-02-26 19:06:21 · 194 阅读 · 0 评论 -
JAVA代码实现冒泡、选择、插入、希尔排序
冒泡、选择、插入、希尔排序今天学习了八大算法中的冒泡、选择、插入、希尔排序算法。以数据从小到大排序为例,谈一谈自己的理解。有错误之处,还望指出,我会及时改正。1. 冒泡排序:冒泡排序每次将相邻元素进行比较,较大的数放在后面,每轮下来,最大的数都会被交换到最后,并且下一轮不需要进行排序了。通过双重for循环实现,平均和最差时间复杂度为O(n^2)。package com.sort.bubbl...原创 2020-02-25 22:07:54 · 170 阅读 · 0 评论 -
JAVA代码实现8皇后问题
8皇后问题最近在学习数据结构中的递归算法,并且使用递归思想学习了著名的8皇后问题。先谈谈自己对递归的理解吧。递归算法就是程序不断的调用自身的过程,递归的过程中,一定要注意两点:1.一定要有终止递归的条件;2.一定要不断的逼近递归的终止条件。程序每次调用自身,就会在调用处重新开辟一个栈空间,如果调用的参数是基本数据类型,那么这个栈空间会将参数作为局部变量存放,只供当前栈空间使用。如果调用的参...原创 2020-02-24 13:48:44 · 184 阅读 · 0 评论 -
JAVA代码实现中缀表达式转后缀表达式并求值
中缀表达式转后缀表达式并求值最近学习了利用栈实现中缀表达式转后缀表达式并求值的实现方式。目前只实现了加减乘除操作,小数部分暂时未考虑。如有错误之处,还望指出,我会及时改正。package com.stack.calulator;import java.util.ArrayList;import java.util.List;import java.util.Stack;/* * ...原创 2020-02-22 15:08:48 · 738 阅读 · 0 评论 -
JAVA代码实现单链表模拟栈
单链表模拟栈今天使用java实现了用单链表模拟栈的操作,有错误之处,还望指出,我会及时改正。package com.stack;import java.util.Scanner;/* * 单链表实现栈的基本操作 */public class SingleLinkedListStackDemo2 { public static void main(String[] args) ...原创 2020-02-20 17:18:33 · 976 阅读 · 5 评论 -
JAVA代码实现数组模拟栈
数组模拟栈今天用java实现了用数组模拟栈的操作,如有错误之处,还望指出,我会及时改正。package com.stack;import java.util.Scanner;public class ArrayStackDemo1 { public static void main(String[] args) { ArrayStack1 stack = new ArraySt...原创 2020-02-20 17:15:59 · 239 阅读 · 0 评论 -
JAVA代码实现双链表的增删改查
双链表的增删改查今天学习了双链表的增删改查操作,如果有错误的地方还望指出,我一定会及时改正。package com.LinkedList.DoubleLinkedList;/* * 双链表的增删改查 */public class DoubleLinkedListDemo2 { public static void main(String[] args) { Node node...原创 2020-02-20 10:39:39 · 248 阅读 · 0 评论 -
JAVA代码实现约瑟夫问题
约瑟夫问题(单向环形链表)今天学习了一下数据结构中的约瑟夫问题。谈了一下自己的解决思路,如果有错误的地方,还望指出,我一定及时改正。问题描述:有n个小孩围坐成一个圈玩游戏,每个小孩按1,2…n进行编号; 从 第k个小孩开始进行报数,数到第m个的小孩出列,然后从他的下一位继续数m个小孩,直到所有人出列,求出列的顺序。package com.LinkedList.DoubleLinkedList...原创 2020-02-19 17:14:38 · 388 阅读 · 1 评论 -
JAVA代码实现单链表的常见操作
单链表的常见操作最近在学习数据结构中单链表的常见操作,用java实现了以下几个操作:单链表的增删改查统计单链表的有效节点个数查找单链表中的倒数第k个节点单链表的反转从尾到头打印单链表合并两个有序的单链表,合并之后的链表依然有序有些地方考虑不周。有错误的地方还望指出,我会及时改正。具体的代码实现如下:package com.LinkedList.summary;impor...原创 2020-02-18 16:16:01 · 274 阅读 · 3 评论