![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据机构-算法
文章平均质量分 66
The..Fuir
这个作者很懒,什么都没留下…
展开
-
【非递归】实现二叉树的前序、中序、后续、层次遍历
先上代码,看不懂请看后面的图解就一定能懂了创建Node类:package Tree1;public class Node { //节点值 int data; Node leftChild; //左孩子 Node rightChild ; //右孩子 //初始化,无参构造器 public Node() { data = 0; leftChild = rightChild = null; } ..原创 2022-04-15 23:37:26 · 220 阅读 · 0 评论 -
JavaScript:文档对象模型DOM的基本使用
目录DOM1.节点层级1.2.节点1.3.节点树2.Node类型2.1.属性2.2.方法3.Document类型3.1.属性3.2.DOM编程界面3.3.查找元素3.4.添加元素3.5.写入4.Element类型4.1.属性4.2.常用方法5.Text类型5.1.属性及方法DOMDOM是JS操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个JS对象,从而可以...原创 2022-04-15 21:30:09 · 211 阅读 · 0 评论 -
【递归】二叉树的前序遍历、中序遍历、后序遍历(顺序存储实现)
什么是顺序存储二叉树一定要看到最后欧基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组要求:1.二叉树的结点能够以数组的方式来存放 arr: [1,2,3,4,5,6,7];2.遍历数组时能够以前序遍历,中序遍历,后序遍历的方式遍历出所有结点特点顺序二叉树通常只考虑完全二叉树 第n个元素的左子节点为 2 * n + 1 第n个元素的右子节点为 2 * n + 2 第n个元素的父节点为 (n-1...原创 2022-04-15 11:08:29 · 2551 阅读 · 0 评论 -
二叉树的顺序存储
一、顺序存储顺序存储是一个让人又爱又恨的玩意儿。爱是因为它理解起来比较简单,查找起来也比较方便;恨是因为这玩意儿太傻瓜,它只一次性地问内存要一段连续的空间,而且坚决不管在实际应用中够用不够用,而且这货在插入和删除元素时居然需要O(n^2)的时间复杂度,这个让人有点无语。那二叉树的顺序存储怎么样呢?让我们来分析分析。1.比如说我有一棵完全二叉树,如图1(a)所示。该二叉树中有6个元素,可以将这六个元素按照层次从上到下,每一层从左到右的规则依次放入一个数组中,如图1(b)所示。除了数组的内存空间的问题.原创 2022-04-15 00:27:56 · 4288 阅读 · 0 评论 -
JavaScript继承与原型链问题(原型继承、经典继承、组合继承)
继承继承是面向对象编程中讨论最多的话题。很多面向对象语言都支持两种继承:接口继承和实现继承。前者只继承方法签名,后者继承实际的方法。接口继承在 ECMAScript 中是不可能的,因为函数没有签名。实现继承是ECMAScript 唯一支持的继承方式,而这主要是通过原型链实现的1.原型链ECMAScript 把原型链定义为 ECMAScript 的主要继承方式。其基本思想就是通过原型继承多个引用类型的属性和方法。重温一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有.原创 2022-04-14 16:18:56 · 636 阅读 · 0 评论 -
二叉树、满二叉树、完全二叉树、二叉排序树、平衡二叉树
目录1.基本概念1.1二叉树是有序树1.2二叉树1.3特殊的二叉树1.3.1满二叉树1.3,2完全二叉树1.4 二叉树的性质二叉排序树平衡二叉树二叉树的存储结构1.基本概念1.1二叉树是有序树二叉树是树形结构中一种特殊的树形结构:1.二叉树中的每个结点至多有2棵子树(即每个结点的度小于等于2)2.两个子树有左右之分,顺序不可颠倒。在二叉树中还有种特殊的二叉树就是完全二叉树:所有结点中除了叶子结点以外的结点都有两棵子树...原创 2022-04-14 14:43:58 · 1739 阅读 · 0 评论 -
树的基本概念定义和性质(附公式推导过程)
树的定义树是n(n>=0)个节点的有限集。当n=0时,称为空树。在任意一颗非空树中应满足:1)有且仅有一个特定的称为根的结点。2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,...,Tm,其中每个集合本身又是一棵树,并且称为根的子树。显然,树的定义是递归的,即在树的定义中又用到了其自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:1)树的根结点没有前驱,除根节点外的所有结点有且只有一个前驱。2)树中所.原创 2022-04-14 11:14:59 · 1238 阅读 · 0 评论 -
什么是串,串的表示和实现串的顺序存储和单链存储
一. 串类型的定义字符串是n(n>=0)个字符的有限序列,记作:S=“C1C2C3...Cn”其中:S是串名字;“C1C2C3…Cn” 是串值;Ci 是串中字符;n 是串的长度;n=0 称为空串;由一个或多个空白符组成的串称为空白串;串中任意个连续字符组成的子序列称为该串的子串;包含子串的串相应地称为主串;通常将子串在主串中首次出现时,该子串首字符对应的主串中的序号,定义为子串在主串中的位置。例如,设 A = “This is a string” , B = “is” 则B是A...原创 2022-04-13 22:26:13 · 298 阅读 · 0 评论 -
数据结构:KMP算法 串的模式匹配算法(全网最详细)
KMP模式匹配算法简述为了解决朴素模式匹配算法的低效kmp模式匹配算法由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 KMP算法是三位学者在 Brute-Force算法的基础上同时提出的模式匹配的改进算.原创 2022-04-12 19:17:28 · 19367 阅读 · 3 评论 -
数据结构:BF算法:串的朴素的简单模式匹配算法(Brute-Force算法)(简单粗暴法)
字串(模式串)的定位操作在主串(也称做目标串)S中,从位置start开始查找是否存在子串(也称做模式串)T,如果在主串S中查找到一个与模式串T相同的子串,则称查找成功;如在主串S中未找到一个与模式串T相同的子串,则称查找失败。当模式匹配成功时,函数返回模式串T的第一个字符在主串S中的位置;当模式匹配失败时,函数返回-1。朴素的模式匹配算法(Brute-Force算法:BF)BF算法的主要思想是:将主串S的第start个字符和模式T的第1个字符比较,若相等,继续逐个比较后续字符;若不等,从主串S.原创 2022-04-11 22:42:38 · 1085 阅读 · 0 评论 -
数据结构:用Java实现双端队列(超详细)
Java双端队列典型的双端队列收集如下所示:双端队列(Deque:double ended queue)就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。相对于普通队列,双端队列的入队和出队操作在两端都可进行。left:左端 right:右端这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成循环队列。并且规定left指向左端的第一个元素,right指向右端的下一个位置。那么队空的判断则是left==right,队满是(le...原创 2022-04-09 23:40:23 · 3515 阅读 · 0 评论 -
数据结构:Java实现循环单链表(超详细)
java实现循环链表实现一个循环链表(单链表),具备增加元素、删除元素、打印循环链表等功能。一丶单向循环链表就是为尾节点指向头结点二丶单向循环链表的接口设计比较单向链表,单向循环链表只需要修改添加节点,删除节点两个方法,也就是add和remove方法三丶单向循环链表的实现3.1添加节点相比于单向链表,单向循环链表只需要特别关注插入头结点的情况即可需要考虑的特殊情况是当链表的长度为0的时候的插入的情况创建节点类package LoopTable;...原创 2022-04-09 21:57:25 · 6883 阅读 · 0 评论 -
数据结构:队列的介绍和用Java实现队列(用数组、集合、堆栈的方法实现)
队列简单介绍队列是一种常用的数据结构之一,与之前的栈类似,不过队列是“先进先出”。队列有队头(front)和队尾(rear),数据从队尾进入队列,从队头出队列,队头(front)指向队列的第一个数据,队尾(rear)指向队列中的最后一个数据。队列实现队列有很多种,这里只是介绍最基本的实现,采用顺序和链式存储,也就是顺序队列和链式队列,与之前的链表存储形式一样,通过结点对象描述一个数据,结点对象包含具体数据和下一个结点的引用。编程题目:1.请用Java实现队列(Queue)。队列.原创 2022-04-06 00:01:40 · 726 阅读 · 0 评论 -
数据结构:栈的概念并且用Java实现栈(两种方法,顺序栈和链式栈)
栈的概念栈是一种只允许在一端进行插入或删除的线性表。1、栈的操作端通常被称为栈顶,另一端被称为栈底。2、栈的插入操作称为进栈(压栈|push);栈删除操作称为出栈(弹栈|pop)。特点栈就像一个杯子,我们只能从杯口放和取,所以栈中的元素是“先进后出”的特点。存储结构顺序存储的栈称为顺序栈;链式存储的栈称为链式栈。java实现我们可以围绕栈的4个元素来实现栈:2状态:是否栈空;是否栈满。2操作:压栈push;进栈pop。顺序栈的实现 顺序栈示意图:.原创 2022-04-05 21:57:13 · 810 阅读 · 0 评论 -
数据结构:Java实现线性表中的双链表以及顺序表和链表的区别
双向链表定义双向链表(双链表),多个结点,每个节点=一个数据域+两个指针域,数据域存数据,指针域分前后,前一个指针域指向前驱结点,后一个指针域指向后继结点。头结点数据域不存储数据,头结点指向前驱结点的指针域的值为null,指向后继结点的指针域指向第一个真正存储数据的结点;尾结点指向后继结点的指针域为null。顺序表和链表的区别顺序表:1.中间或前面部分的插入删除时间复杂度O(N)2.增容的代价比较大3.空间连续、支持随机访问链表:1.任意位置插入删除时间复杂度为..原创 2022-04-05 00:09:21 · 379 阅读 · 0 评论 -
数据结构:Java实现线性表表中的单链表(头插法,尾插法)
链表是最基本的数据结构,其存储的你原理图如下图所示上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。把方法都写在一个类中,封装起来package LinearTable.Si..原创 2022-04-04 22:59:10 · 1420 阅读 · 0 评论 -
数据结构:Java实现线性表中的顺序表
什么是顺序表?静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。 顺序存储的线性表的特点:◆ 线性表的逻辑顺序与物理顺序一致;◆ 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。一个标准的顺序表需要实现以...原创 2022-04-04 15:44:08 · 967 阅读 · 0 评论 -
数据结构(Java):排序算法之基数排序(又称桶排序)
基数排序(又称桶子法):基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。计数排序的原理:就是用一个数组来统计每种数字出现的次数,然后按照大小顺序将其依次放回原数组,达成.原创 2022-03-30 12:25:26 · 1957 阅读 · 0 评论 -
数据结构与算法(Java):归并排序
归并排序:基本思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2^n。合并相邻有序子序列:...原创 2022-03-22 22:46:58 · 541 阅读 · 0 评论 -
数据结构(Java):选择排序之堆排序
堆排序堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶.原创 2022-03-21 17:06:44 · 161 阅读 · 0 评论 -
数据结构中二叉树的概念:什么是二叉数,什么是完全二叉树,什么是满二叉树,什么是平衡二叉树?什么是二叉查找树?
简单地理解,满足以下两个条件的树就是二叉树:本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;二叉树的性质经过前人的总结,二叉树具有以下几个性质:二叉树中,第 i 层最多有 2^(i-1) 个结点。 如果二叉树的深度为 K,那么此二叉树最多有 (2^K) -1 个结点。 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。性质 3 的计算方法为:对于一个二叉树来说,除了度为 0 的叶子结点和度...原创 2022-03-17 23:27:35 · 318 阅读 · 0 评论 -
数据结构:选择排序之简单选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。时间复杂度:O(n^2)空间效率,空间复杂度:O(1)比较次数与序列的的初始化无关,始终是n(n-1)/2次数据结构基本十大算法:动图演示代码实现p...原创 2022-03-16 23:39:15 · 1003 阅读 · 0 评论 -
数据结构:交换排序中的快速排序
快速排序:public class QuickSort { public static void main(String[] args) { int[] a=new int[]{49,38,65,97,76,13,27,49}; int n=a.length; Quicksort0(a,0,n-1); for (int c=0;c<n;c++){ System.out.print(a[c]+"原创 2022-03-16 14:48:22 · 92 阅读 · 0 评论 -
数据结构:交换排序之冒泡排序
冒泡排序:如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。1.原理:比较两个相邻的元素,将值大的元素交换到右边2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。 (1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。 (2)比较第2和第3个数,将小数 放在前面,大数放在后面。 ...... (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成 (4原创 2022-03-15 21:33:33 · 346 阅读 · 0 评论 -
数据结构:什么是时间复杂度和空间复杂度
目录时间复杂度空间复杂度先简要介绍一下:算法复杂度分为时间复杂度和空间复杂度。其作用:时间复杂度是指执行这个算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。时间和空间(即寄存器)都是计算机资源的重要体现,而算法的复杂性就是体现在运行该算法时的计算机所需的资源多少。在面试的时候,如果面试官问你,你知道什么是时间复杂度和空间复杂度吗?你会吗???,虽然这东西天天在嘴巴上跑,像我一样吊儿郎当,肯定不会,哈哈哈哈,但是要我用一个很通俗易懂的语言来讲讲,我真的真的不知原创 2022-03-15 15:58:52 · 362 阅读 · 0 评论 -
数据结构:插入排序中的希尔排序
希尔排序一、概念及其介绍希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。二、适用说明希尔排序时间复杂度是O(n^(1.3-2)),只使用了常数个辅助单元,因而空间复杂度为常数阶O(1)。希尔排序没有时间复杂度为O(n(logn))的快速排序算法快 ,因...原创 2022-03-15 15:15:54 · 90 阅读 · 0 评论 -
数据结构:插入排序之折半查找(二分查找)
图示:以i=4时为例:第一步第二步第三步:第四步:第五步:第六步:第七步:public class InsertSort { public static void main(String[] arg) { int[] a=new int[] {49,38,65,97,76,13,27}; int n=a.length; InsertSort1(a,n); } sta.原创 2022-03-14 23:21:59 · 779 阅读 · 0 评论 -
最简洁明了易懂,数据结构:插入排序之直接插入排序
直接插入排序:举例49 38 65 97 76 13 27 79直接插入排序就是依次排序 :第一次排序 38与49 比较交换 变成 38 49 65 97 76 13 27 79第二次是65与前面的38 49 比较 不交换38 49 65 97 76 13 27 79第二次是97与前面的38 49 比较 不交换38 49 65 97 76 13 27 79。。。public class InsertSort { public static void main(.原创 2022-03-14 22:43:22 · 1150 阅读 · 0 评论 -
数据结构之排序的基本定义
排序的定义:排序:就是重新排列表中的元素,是表中的元素满足按关键字有序的过程。算法的稳定性:例如: 排序表中有两个元素R1和R2,其对应的关键字相同即key1=key2,且在排序前R1排在R2的前面,若使用某一排序算法后,R1仍然排在R2前面,则称这个排序算法是稳定的。排序算法可分为两类:内部排序和外部排序内部排序:是指在排序期间元素全部存放在内存中的排序外部排序:是指在排序期间元素无法全部存放在内存中的排序,必须在排序的过程中根据要求不断地在内存、外存之间移动的排序。排序算法可分为原创 2022-03-13 17:04:15 · 723 阅读 · 0 评论