![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 57
姜皓
胸藏文墨怀若谷 腹有诗书气自华
展开
-
重学数据结构与算法(09)--树和二叉树:分支关系与层次结构下如何有效实现增删查?
树和二叉树:分支关系与层次结构下如何有效实现增删查?1)树是什么2)二叉树是什么3)树的基本操作3.1)二叉查找树的特性3.2)二叉查找树的查找操作3.3)二叉查找树的插入操作4)树的案例5)总结1)树是什么树是由结点和边组成的,不存在环的一种数据结构。通过下图,我们就可以更直观的认识树的结构:树满足递归定义的特性。也就是说,如果一个数据结构是树结构,那么剔除掉根结点后,得到的若干个子结构也是树,通常称作子树。在一棵树中,根据结点之间层次关系的不同,对结点的称呼也有所不同。我们来看下面这棵树,如下图原创 2020-06-26 15:23:03 · 240 阅读 · 0 评论 -
重学数据结构与算法(08)--字符串:搞定字符串匹配算法
字符串:搞定字符串匹配算法1)字符串是什么2)字符串的基本操作2.1)字符串的新增操作2.2)字符串的删除操作2.3)字符串的查找操作子串查找(字符串匹配)查找出两个字符串的最大公共字串3)总结1)字符串是什么字符串(string) 是由 n 个字符组成的一个有序整体( n >= 0 )。例如,s = “BEIJING” ,s 代表这个串的串名,BEIJING 是串的值。这里的双引号不是串的值,作用只是为了将串和其他结构区分开。字符串的逻辑结构和线性表很相似,不同之处在于字符串针对的是字符集,也就原创 2020-06-25 16:35:42 · 424 阅读 · 0 评论 -
重学数据结构与算法(07)--数组:如何实现基于索引的查找?
数组:如何实现基于索引的查找?1)数组是什么2)数组的基本操作2.1)数组的新增操作2.2)数组的删除操作2.3)数组的查找操作2.4)数组增删查操作的特点3)数组的案例4)总结由于栈和队列是特殊的线性表,本质上他们都可以被看作是一类基本结构。而数组则可以看成是线性表的一种推广,它属于另外一种基本的数据结构。这一课时,我们就来学习数组的概念以及如何用数组实现增删查的操作。1)数组是什么数组是数据结构中的最基本结构,几乎所有的程序设计语言都把数组类型设定为固定的基础变量类型。我们可以把数组理解为一种容器原创 2020-06-20 17:23:57 · 444 阅读 · 0 评论 -
重学数据结构与算法(05)--栈:后进先出的线性表,如何实现增删查?
栈:后进先出的线性表如何实现增删查1)栈是什么?2)栈的基本操作线性表是使用非常广泛的一类数据结构,它对数据的顺序非常敏感,而且它对数据的增删操作非常灵活。在有序排列的数据中,可以灵活的执行增删操作,就好像是为排好队的数据增加了插队的入口。这既是灵活性也是缺陷,原因在于它的灵活性在某种程度上破坏了数据的原始顺序。在某些需要严格遵守数据处理顺序的场景下,我们就需要对线性表予以限制了。经过限制后的线性表,它们通常会被赋予一些新的名字,这一课时来学习其中一个限制后的线性表–栈1)栈是什么?你需要牢记一点,栈原创 2020-06-11 09:18:50 · 500 阅读 · 0 评论 -
图解数据结构(09) -- 优先队列
优先队列1、优先队列的特点2、优先队列的实现3、优先队列的代码实现1、优先队列的特点队列 的特点是 先进先出, 入队列,将新元素置于队尾:出队列,队头元素最先被移出:优先队列不再遵循先入先出的原则,而是分为两种情况:最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队例:有一个最大优先队列,其中的最大元素是8,...原创 2020-03-24 08:56:59 · 1052 阅读 · 0 评论 -
图解数据结构(08) -- 二叉堆
二叉堆1、初识二叉堆2、二叉堆的自我调整【1】插入节点【2】删除节点【3】构建二叉堆3、二叉堆的代码实现1、初识二叉堆二叉堆本质上是一种完全二叉树,它分为两个类型:最大堆最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值,如下图所示:最小堆最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值,如下图所示:堆顶二叉堆的根节点叫作堆顶;最大堆和最小堆的特点决定了...原创 2020-03-16 21:03:04 · 294 阅读 · 1 评论 -
图解数据结构(07) -- 广度优先遍历
广度优先遍历如果说深度优先遍历是在一个方向上“一头扎到底”,那么广度优先遍历则恰恰相反:先在各个方向上各走出1步,再在各个方向上走出第2步、第3步……一直到各个方向全部走完。下面让我们通过二叉树的层序遍历,来看一 看广度优先是怎么回事:【层序遍历,就是二叉树按照从根节点到叶子节点的层次关系,一层一层横向遍历各个节点】上图就是一个二叉树的层序遍历,每个节点左侧的序号代表该节点的输出顺序;但...原创 2020-03-16 20:12:54 · 2931 阅读 · 0 评论 -
图解数据结构(06) -- 二叉树的遍历
二叉树的遍历1、二叉树的遍历二叉树遍历分类2、深度优先遍历【1】前序遍历【2】中序遍历【3】后序遍历1、二叉树的遍历在计算机程序中,遍历本身是一个线性操作,所以遍历同样具有线性结构的数组或链表是一件轻而易举的事情,如下图:二叉树则是典型的非线性数据结构,遍历时需要把非线性关联的节点转化成一个线性的序列,以不同的方式来遍历,遍历出的序列顺序也不同:二叉树遍历分类从节点之间位置关系的角度...原创 2020-01-14 21:07:43 · 429 阅读 · 0 评论 -
图解数据结构(05) -- 二叉树
二叉树1、什么是树2、什么是二叉树满二叉树完全二叉树二叉树的物理存储结构链式存储结构数组存储结构3、二叉树的应用【1】查找【2】 维持相对顺序1、什么是树在数据结构中,树的定义如下:树(tree)是 n(n≥0)个节点的有限集,当n=0时,称为空树,在任意一个非 空树中,有如下特点:有且仅有一个特定的称为根的节点;当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每...原创 2020-01-02 19:55:18 · 1106 阅读 · 0 评论 -
图解数据结构(03) -- 栈
栈1、什么是栈2、栈的基本操作【1】入栈【2】出栈3、栈的应用1、什么是栈假如有一个又细又长的圆筒,圆筒一端封闭,另一端开口;往圆筒里放入乒乓球,先放入的靠近圆筒底部,后放入的靠近圆筒入口,如下图:如果要想取出这些乒乓球,则只能按照和放入顺序相反的顺序来取,先取出后放入的,再取出先放入的,而不可能把最里面最先放入的乒乓球优先取出栈(stack)是一种线性数据结构,它就像一个上图所示的放...原创 2019-12-29 23:37:37 · 434 阅读 · 0 评论 -
图解数据结构(02) -- 链表
链表1、什么是链表单向链表双向链表链表的存储方式2、链表的基本操作【1】查找节点【2】更新节点【3】插入节点【4】删除元素3、数组VS链表1、什么是链表单向链表链表(linkedlist)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成;单向链表的每一个节点又包含两部分,一部分是存放数据的变量 data,另一部分是指向下一个节点的指针 next结构图:代码实现: ...原创 2019-12-28 16:02:57 · 504 阅读 · 0 评论 -
图解数据结构(01) -- 数组
数组1、什么是数组数组对应的英文是 array,是有限个相同类型的变量所组成的有序集合,数组中 的每一个变量被称为元素。数组是最为简单、最为常用的数据结构;以整型数组为例,数组的存储形式如下图所示:数组中的每一个元素有着自己的下标,只不过这个下标从0开始,一直到数组长度-1;数组的另一个特点,是在内存中顺序存储,因此可以很好地实现逻辑上的顺序表。数组在内存中的顺序存储:内存是由一个个连续...原创 2019-12-26 20:41:37 · 1541 阅读 · 0 评论 -
玩转数据结构(20)-- 红黑树
红黑树史上最清晰的红黑树讲解(上)史上最清晰的红黑树讲解(下)一、概述图示:红黑树是二分搜索树,并在二分搜索树的基础上添加一些性质确保其不会退化为链表,保证其是平衡二叉树《算法导论》中的具体规定:1.每个节点要么是红色,要么是黑色;2.根节点是黑色的3.每个叶子节点(最后的空节点)是黑色的4.如果一个节点是红色的,则其两个孩子节点都是黑色的5.从任意...原创 2019-07-25 17:16:52 · 574 阅读 · 0 评论 -
玩转数据结构(19)-- AVL
AVL在二分搜索树中,如果是顺序添加进搜索树的话,则会排成一列,成为链表,从而极大的降低二分搜索树的执行效率; 解决这个问题:在二分搜索树的基础上添加一定的机制,使得二分搜索树能够维持平衡二叉树的性质;AVL : 最经典的平衡二叉树;(发明人:Adelson-Velsky 和 E.M.Landis 名字缩写为 AVL),最早的自平衡二分搜索树结构;平衡二叉树:【详解...原创 2019-07-25 17:17:01 · 386 阅读 · 0 评论 -
玩转数据结构(18)-- 并查集
并查集(Union Find)一、概述一个很有意思的并查集详解由孩子节点指向父亲节点的树结构,解决连接问题,如图来判断两个点之间是否是连接的并查集:可以快速判断网络中节点间的连接状态【网络:抽象概念,用户之间形成的网络】可以高效回答连接问题的数据结构对于一组数据,主要支持两个动作:1.uoion(p,q) --并,传入数据 p 和 q,在并查集内部将这两个数据,以及...原创 2019-07-25 17:17:21 · 303 阅读 · 0 评论 -
玩转数据结构(17)-- 字典树
字典树(Tire)[前缀树]一、概述【多叉树】 专门处理字符串,专门为 字典(一个词条和一个示意相对应)设计的数据结构;在 字典 中,有 n 个词条,使用 映射 方式查找,本质是使用 树结构 ,查询的时间复杂度是 O(log n);使用 字典树(Tire) 的数据结构时,查询每个词条的时间复杂度与 字典 中一共有多少条目无关;与查询字符串[单词]的长度 w 相关,时间复杂度为...原创 2019-07-25 17:17:33 · 583 阅读 · 0 评论 -
玩转数据结构(16)-- 线段树
线段树【区间树】(Segment Tree)一、为何使用线段树对于有一类问题,我们关心的是线段(或区间)经典线段树问题:区间染色有一面墙,长度为 n ,每次选择一段墙进行染色染色过程:1. 4-9 黄色2. 7-15 绿色3. 1-5 蓝色4. 6-12 红色存在颜色覆盖问题,1.m 次操作后,可以看见多少种颜...原创 2019-07-25 17:17:42 · 241 阅读 · 0 评论 -
玩转数据结构(21)-- 哈希表
哈希表一、哈希表基础从习题入手【题目链接】思路:可以不使用树结构来实现映射,可以直接设置包含 26个 元素的数组,对数组中每一位表示某一个字符对应的频率即可;索引为 0 的位置表示 a ,索引为 1 的位置表示 b ,以此类推。哈希表定义:把所关心的键通过哈希函数转换为索引,然后直接把内容存在数组中即可代码:class Solution { public in...原创 2019-07-25 17:16:27 · 450 阅读 · 0 评论 -
玩转数据结构(09)--二分搜索树的遍历
二分搜索树的遍历一、二分搜索树的前序遍历遍历:就是把所有的节点都访问一遍二分搜索树的递归操作:从根节点开始,查看根节点是否是要查找的元素;是的话直接执行操作即可,不是的话就看要查找的元素是否 < 根节点 ,是的话在左子树中继续进行该操作;若是 > 根节点,在右子树中继续进行该操作【每次只选择一个子树进行下去】tranverse(node.left) -- 既要进行二...原创 2019-07-25 17:19:09 · 439 阅读 · 0 评论 -
玩转数据结构(08)--二分搜索树
二分搜索树(Binary Search Tree)一、树结构使用树结构的原因:1.树结构是一种天然的组织结构 2.数据使用树结构存储后,查找高效二叉树:是动态数据结构【不需要在创建数据结构的时候就决定好要存储多少数据,要添加元素就 new 一个新的空间加入到其中即可,删除二、基础概念同理】 节点 Node 中,除了要存放元素 e 之外...原创 2019-07-25 17:19:16 · 749 阅读 · 0 评论 -
玩转数据结构(10)--二分搜索树的层序遍历
二分搜索树的层序遍历前序、中序、后序遍历本质都是深度优先遍历层序遍历:根节点设置为第0层;先遍历第0层28、再遍历第1层16、30;再遍历第2层13、22、29、42;逐层向下遍历的节点在广度上进行拓展;这种遍历方式也称为广度优先遍历;通常使用非递归的方式实现图解:用队列的方式实现层序遍历1.每一次一个元素入队,从队尾的位置进入队列,初始化时将根节点入队2.以后每一次...原创 2019-07-25 17:18:54 · 553 阅读 · 0 评论 -
玩转数据结构(11)--删除二分搜索树的节点
删除二分搜索树的节点一、删除二分搜索树的最小值和最大值1.先找到二分搜索树的最小值和最大值最小值:二叉树中的最左侧的元素(不存在左孩子的节点)最大值:二叉树中的最右侧的元素(不存在右孩子的节点)2.再删除二分搜索树的最小值和最大值 1.当要删除的节点为叶子节点时,直接删除即可2.当要删除的节点不是叶子节点时,将该节点删除,删除后将其整个右子树变为根节点的左...原创 2019-07-25 17:18:47 · 359 阅读 · 0 评论 -
玩转数据结构(12)--集合基础与集合实现
集合(set)基础与集合实现一、 集合基础和基于二分搜索树的集合实现集合:承载元素的容器,但每个元素都只能存在一次;能够快速实现“去重”这个工作;(二分搜索树不能添加重复元素,是非常好的实现“集合”的底层数据结构)基础功能代码:Set<E>void add(E) :向集合中添加元素E(不能添加重复元素)void remove(E) :从集合中删除元...原创 2019-07-25 17:18:30 · 997 阅读 · 0 评论 -
玩转数据结构(02)--数组_2
在上篇博客基础上继续--《玩转数据结构(01)--数组》1.动态数组(解决数组空间不够用的情况)Java 中的静态数组,当插入的值数量 > 数组的size 时就会报错,使用动态数组可以解决这个问题,设置动态数组的思路:再建立一个新的数组newData,它要比之前的数组空间大一些;将data 中的数据放入到 newData 中,循环遍历数组data中所有的元素,将他们依次赋值到n...原创 2019-07-25 17:20:14 · 296 阅读 · 0 评论 -
玩转数据结构(03)--栈
栈(Stack)栈是一种线性数据结构;具有不可思议的作用相比数组,栈对应的操作是数组的子集栈只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶图解:向栈中添加元素【入栈】(4只能在3的上面,只能从一端添加元素)从栈中取出栈顶元素【出栈】(只能先取出 4,用户甚至都看不到其他的值)由此可知:数组是一种后进先出的数据结构(Last In First Out)[L...原创 2019-07-25 17:20:01 · 533 阅读 · 0 评论 -
玩转数据结构(04)--队列
队列(Queue)一、基本概念队列是一种线性数据结构;相比数组,队列对应的操作也是数组的子集;只能从一端(队尾)添加元素,只能从另一端(队首)取出元素;图解:队列就相当于排队由上图知,队列是先进先出的数据结构(First In First Out [FIFO]);二、队列的实现数组队列:队列的基本操作:Queue<E>void enqueu...原创 2019-07-25 17:19:54 · 721 阅读 · 1 评论 -
玩转数据结构(12)--映射基础与映射实现
映射基础与映射实现一、映射(Map)基础定义:定义域中的每一个值在止于中都有一个值与它对应;存储(键、值)【Key、Value】数据对的数据结构;根据键,来快速的寻找值,可以非常容易的使用二分搜索树来实现它实现机制:Map<K,V> 通过泛型来实现,向 Map 中传入 Key 和 Value 这两个环境变量;void add(K,V) 添加...原创 2019-07-25 17:18:22 · 536 阅读 · 0 评论 -
玩转数据结构(13)-- 优先队列和堆的添加/取出操作
优先队列和堆一、优先队列普通队列:先进先出,后进后出优先队列:出队顺序和入队顺序无关;和优先级相关;(例如医院排队和操作系统动态选择优先级最高的任务执行)图解:关键词“动态”;队列中的元素是在不断变化的,不断有新元素入队,不仅仅是按照优先级排序;【优先级可以具体定义】与普通队列的区别:出队元素是优先级最高的元素;队首元素也是优先级最高的元素,而不是最早进入队列的元素;...原创 2019-07-25 17:18:10 · 502 阅读 · 0 评论 -
玩转数据结构(05)--链表
链表(Linked List)一、基本概念链表:最简单的动态数据结构重要性:更深入的理解引用和递归,辅助组成其他数据结构优点:真正的动态,不需要处理固定的容量缺点:丧失了随机访问的能力与数组对比:数组最好用于索引有语义的情况(例 score[2]),其最大的有点是支持快速查询; 链表不适合用于索引有语义的情况,最大优点是动态...原创 2019-07-25 17:19:45 · 728 阅读 · 0 评论 -
玩转数据结构(14)-- 堆中的Heapify 和 Replace
Heapify 和 Replace一、replace定义:取出最大元素后,放入一个新元素【堆中总数没有变化】实现方法:1.可以先 extractMax,再 add,两次O(log n)的操作; 2.可以直接将堆顶元素替换以后 Sift Down,一次 O(log n)的操作;代码实现:MaxHeap.javapublic class Ma...原创 2019-07-25 17:17:59 · 943 阅读 · 2 评论 -
玩转数据结构(15)-- 基于堆的优先队列
基于堆的优先队列一、代码实现Queue.javapublic interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E e); E dequeue(); E getFront();}PriorityQueue.javapublic cl...原创 2019-07-25 17:17:51 · 202 阅读 · 0 评论 -
玩转数据结构(06)--链表_2
链表(Linked List)(在上篇博客的基础上继续)四、链表的遍历,查询和修改示例代码:LinkedList.javapublic class LinkedList<E> { private class Node{ public E e; public Node next; public Node(E e...原创 2019-07-25 17:19:31 · 221 阅读 · 0 评论 -
Java面试--常见的边界控制问题
常见的边界控制问题二分查找例 【二分查找】 在有序数组中查找元素 k ,返回 k 所在的下标在数组 [1,2,10,15,100] 中去寻找 15 ,15 的下标是 3 ;二分查找思路:代码实现:BinarySearch.javapackage interview.loop;public class BinarySearch { /** * Se...原创 2018-09-24 09:48:40 · 596 阅读 · 0 评论 -
玩转数据结构(07)--链表和递归
链表和递归题目:Leetcode 203. Remove Linked List Elements示例代码:Solution.java【不使用虚拟头结点】class Solution { public ListNode removeElements(ListNode head, int val) { while(head != null &&...原创 2019-07-25 17:19:24 · 295 阅读 · 0 评论 -
Java面试--二叉树的遍历
二叉树的遍历一、前序遍历遍历顺序:先前序遍历树根,再前序遍历左子树,再前序遍历右子树先遍历树根(A)--再遍历左子树(B)--再遍历左子树(D)--(D没有左子树了)再遍历右子树(E)--再遍历左子树(G)--(A没有左子树了)再遍历右子树(C)--(C没有左子树了)再遍历右子树(F) ;故顺序为 A-B-D-E-G-C-F; 二、中序遍历遍历顺序:先中序遍历左子树...原创 2018-09-26 10:51:19 · 3291 阅读 · 1 评论 -
Java面试--面试中常考的递归问题
面试中常考的递归问题一、链表创建定义函数 CreateLinkedList,让其返回值为 Node(链表头),每次必须缩小问题规模且必须为1;则将 1 拆掉,把 2、3、4、5 添入到CreateLinkedList,再把 1 和 2、3、4、5 连接起来即可;如何接:把 1 的 next 和 2、3、4、5 的 head 接起来就完成了链表的创建;代码实现:...原创 2018-09-19 23:10:02 · 1787 阅读 · 0 评论 -
玩转数据结构(01)--数组
一、数据结构分类:1.线性结构:数组、栈、队列、链表、哈希表...2.树结构:二叉树、二分搜索树、AVL、红黑树、Treap、Splay、堆、Trie、线段树、K-D树、并查集、哈夫曼树...3.图结构:邻接矩阵、邻接表二、数组1.定义:把数据码成一排进行存放2.图解:3.示例代码 Main.javapublic class Main { publ...原创 2019-07-25 17:20:28 · 1880 阅读 · 0 评论