![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 91
bfhonor
没有天生的高手,更没有永远的菜鸟。
展开
-
红黑树(Red Black Tree)删除操作及其平衡性能
一、红黑树(Red Black Tree)删除操作B树中,最后真正被删除的元素都在叶子节点中1、删除 – RED节点直接删除,不用作任何调整2、删除 – BLACK节点有 3 种情况①、拥有 2 个RED 子节点的BLACK 节点✓ 不可能被直接删除,因为会找它的子节点替代删除✓ 因此不用考虑这种情况②、拥有 1 个 RED子节点的BLACK 节点③、BLACK 叶子节点3、删除 – 拥有1个RED子节点的BLACK节点判定条件:用以替代的子节点是 RED将替代的子节点染成 BLA原创 2021-01-30 21:54:07 · 1195 阅读 · 3 评论 -
红黑树(Red Black Tree)相关概念以及不同添加操作的详解
红黑树(Red Black Tree)红黑树也是一种自平衡的二叉搜索树。以前也叫做平衡二叉B树(Symmetric Binary B-tree)红黑树必须满足以下 5 条性质①、节点是RED或者BLACK②、根节点是BLACK③、叶子节点(外部节点,空节点)都是 BLACK④、RED节点的子节点都是BLACK✓ RED节点的parent都是BLACK✓ 从根节点到叶子节点的所有路径上不能有 2 个连续的RED节点⑤、从任一节点到叶子节点的所有路径都包含相同数目的BLACK节点原创 2021-01-28 21:07:30 · 632 阅读 · 4 评论 -
B树(B-tree、B-树)性质以及其上溢、下溢的解决方法
一、B树(B-tree、B-树)B树是一种平衡的多路搜索树,多用于文件系统、数据库的实现仔细观察B树,有什么眼前一亮的特点?①、1 个节点可以存储超过 2 个元素、可以拥有超过 2 个子节点②、拥有二叉搜索树的一些性质③、平衡,每个节点的所有子树高度一致④、比较矮(一)m阶B树的性质(m≥2)假设一个节点存储的元素个数为x①、根节点:1 ≤ x ≤ m − 1②、非根节点:┌ m/2 ┐ (向上取整)− 1 ≤ x ≤ m − 1③、如果有子节点,子节点个数 y = x +原创 2021-01-24 16:05:04 · 961 阅读 · 0 评论 -
AVL树底层源码分析实现以及通过两种方式将失衡的二叉搜索树进行平衡操作
AVL树AVL树是最早发明的自平衡二叉搜索树之一AVL 取名于两位发明者的名字G. M. Adelson-Velsky 和 E. M. Landis(来自苏联的科学家)平衡因子(Balance Factor):某结点的左右子树的高度差AVL树的特点①、每个节点的平衡因子只可能是 1、0、-1(绝对值 ≤ 1,如果超过 1,称之为“失衡”)②、每个节点的左右子树高度差不超过 1③、搜索、添加、删除的时间复杂度是 O(logn)平衡对比输入数据:35, 37, 34, 56, 25,原创 2021-01-21 21:59:15 · 136 阅读 · 0 评论 -
平衡二叉搜索树和AVL树以及解决失衡的方法
平衡二叉搜索树如果是按照7,4,9,2,5,8,11的顺序添加节点。那么树的结构图如下:如果元素是从小到大添加节点当 n 比较大时,两者的性能差异比较大比如 n = 1000000 时,二叉搜索树的最低高度是 20退化成链表的另一种情况删除节点时也可能会导致二叉搜索树退化成链表添加、删除节点时,都可能会导致二叉搜索树退化成链表有没有办法防止二叉搜索树退化成链表?让添加、删除、搜索的复杂度维持在O(logn)平衡(Balance)平衡:当节点数量固定时,左右子树的高度越接原创 2021-01-20 21:14:46 · 801 阅读 · 1 评论 -
查找二叉树的前驱节点和后继节点
前驱节点前驱节点:中序遍历时的前一个节点。如果是二叉搜索树,前驱节点就是前一个比它小的节点。node.left != null 举例:6、13、8predecessor = node.left.right.right.right...,终止条件:right为nullnode.left == null && node.parent != null,举例:7、11、9、1predecessor = node.parent.parent.parent...终止条件:node在p原创 2020-12-05 21:21:28 · 3068 阅读 · 1 评论 -
二叉搜索树的相关概念及其接口设计(二叉树节点的添加和删除操作具体实现)
二叉搜索树(Binary Search Tree)二叉搜索树是二叉树的一种,是应用广泛的一种二叉树,英文简称BST又被称为:二叉查找树、二叉排序树。任意一个节点的值都大于其左子树所有节点的值。任意一个节点的值都小于其右子树所有节点的值。它的左右子树也是一棵二叉搜索树。二叉搜索树可以大大提高搜索数据的效率。二叉搜索树存储的元素必须具备可比较性。①、比如:int、double等②、如果是自定义类型,需要指定比较方式。③、不允许为null二叉搜索树的接口设计原创 2020-12-02 21:46:34 · 212 阅读 · 0 评论 -
二叉树的四种遍历方式(前序遍历、中序遍历、后序遍历、测层序遍历)
二叉树的遍历遍历是数据结构中的常见的操作,把所有元素都访问一遍。线性数据结构的遍历比较简单①、正序遍历②、逆序遍历根据节点访问顺序的不同,二叉树的常见遍历方式用四种①、前序遍历(Preorder Traversal)②、中序遍历(Inorder Traversal)③、后序遍历(Postorder Traversal)④、层序遍历(Level Order Traversal)前序遍历(Preorder Traversal)访问顺序根节点、前序遍历左子树、前序遍历右子原创 2020-12-02 21:07:50 · 7553 阅读 · 1 评论 -
实现计算二叉树的高度、判断一课树是否为完全二叉树以及经典算法题目翻转二叉树
打印二叉树的高度递归的形式实现:public int height() { return height(root);}private int height(Node<E> node) { if (node == null) return 0; return 1+Math.max(height(node.left), height(node.right));}非递归形式实现:/* 非递归实现高度的计算 */public int height1() { if(ro原创 2020-11-30 21:08:38 · 280 阅读 · 1 评论 -
二叉树的相关概念及其性质
树型结构树(Tree)的基本概念节点:每个元素称为结点根节点:一棵树最多有一个根节点,父节点:若一个结点含有子结点,则这个结点称为其子结点的父结点子节点:一个结点含有的子树的根结点称为该结点的子结点兄弟节点:具有相同父结点的结点互称为兄弟结点一棵树可以没有任何节点,称为空树。一棵树可以只有1个节点,也就是只有根节点。子树、左子树、右子树节点的度(degree):子树的个数树的度:所有节点度中最大值。叶子节点(leaf):度为0的节点原创 2020-11-10 20:05:00 · 1725 阅读 · 0 评论 -
循环队列和循环双端队列
循环队列(Circular Queue)循环队列底层用数组实现。循环双端队列:可以进行两端添加、删除操作的循环队列队列底层也可以使用动态数组实现,并且各项接口也可以优化到O(1)的时间复杂度这个用数组实现优化之后的队列也叫做:循环队列。上述图示:①、front == tail时队列为空②、front==(tail + 1) % c队列为满③、capacity中,浪费一个空间package com.mj.circle;public class CircleQueue<E>原创 2020-11-03 21:33:21 · 546 阅读 · 1 评论 -
队列(Queue)和双端队列(Deque)的分析以及LeetCode(用栈实现队列)的试题解析
队列(Queue)队列是一种特殊的线性表,只能在头尾两端进行操作。队尾(rear):只能从队尾添加元素,一般叫做enQueue,入队。队头(front):只能从队头移除元素,一般叫做deQueue,出队。先进先出的原则,First In First Out,FIFO我们可以将栈看做一个动态数组(ArrayList)或者一个线性表(List),这样很好的实现栈的添加和删除等操作。下面通过将上一次我们写的ArrayList动态数组导入进去,变为Stack(栈)的一部分,原创 2020-11-02 21:13:35 · 615 阅读 · 0 评论 -
栈(Stack)底层分析以及LeetCode(有效的括号)试题解析
栈(Stack)栈是一种特殊的线性表,只能在一端进行操作。往栈中添加元素的操作,一般叫做push,入栈从栈中移除元素的操作,一般叫做pop,出栈(只能移除栈顶元素,也叫做:弹出栈顶元素)后进先出的原则,Last In First Out,LIFO我们可以将栈看做一个动态数组(ArrayList)或者一个线性表(List),这样很好的实现栈的添加和删除等操作。原创 2020-11-02 09:44:56 · 190 阅读 · 0 评论 -
约瑟夫问题(Josephus Problem)
## 约瑟夫问题(Josephus Problem)- 约瑟夫问题:有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?### 如何发挥循环链表的最大威力?可以考虑增设1个成员变量、3个方法current:用于指向某个节点void reset():current指向头节点firstE next():让current往后走一步,也就是current = current.next原创 2020-10-24 17:17:21 · 403 阅读 · 0 评论 -
单向循环链表和双向循环链表的结构分析
单向循环链表:如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是把尾节点的下一跳指向头结点。单向循环链表 –多个节点和只有一个节点的结构分析双向循环链表:双向循环链表 –多个节点和只有一个节点的结构分析双向循环链表直接体现为 双向和循环,一般的单链表只有节点数据data和next指向地址(应该也是引用的意思),而在此需要增加前面部分的pre指向地址,同时还需要循环循环则在定义节点时可以解决,原创 2020-10-23 15:50:18 · 1045 阅读 · 0 评论 -
ArrayList动态数组底层封装分析
动态数组1、什么是数据结构?数据结构是计算机存储、组织数据的方式2、线性表线性表是具有 n 个相同类型元素的有限序列( n ≥ 0 )常见的线性表有 ①、数组 ②、链表 ③、栈 ④、队列 ⑤、哈希表(散列表)3、数组(Array)数组是一种顺序存储的线性表,所有元素的内存地址是连续的4、动态数组(Dynamic Array)接口设计int size(); // 元素的数量boolean isEmpty(); // 是否为空boolean contains(E原创 2020-10-21 21:07:48 · 331 阅读 · 0 评论 -
LeetCode斐波那契数列复杂度分析、Eclipse环境搭建及快捷键
算法(一)复杂度1、开发环境的搭建(1)eclipse代码提示增强将需要代码提示的字符输入到下面的文本框比如输入入.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789原创 2020-10-14 19:28:26 · 492 阅读 · 0 评论 -
双向链表(Linked List)- clear、node、add、remove方法的底层封装
双链表(Linked List)链表的设计双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。public class LinkedList<E> extends AbstractList<E>{ private Node<E> first; private Node<E> last;原创 2020-10-11 17:31:50 · 732 阅读 · 0 评论 -
虚拟头结点、均摊复杂度和动态数组的缩容、扩容
一、虚拟头结点(了解)有时候为了让代码更加精简,统一所有节点的处理逻辑,可以在最前面增加一个虚拟的头结点(不存储数据)在上一篇我们编写的底层LinkedList.java文件中添加一个构造方法public LinkedList2() { first = new Node<>(null, null);}在我们添加虚拟头结点后,由于第一个节点是虚拟头结点为null,我们要想获取index位置的对应节点对象,只需要头节点指向first.next即可.Node<E> n原创 2020-10-10 23:14:40 · 197 阅读 · 2 评论 -
单链表(Linked List)的clear、add、remove、indexOf以及toString方法的底层封装
链表(Linked List)动态数组有个明显的缺点:可能会造成内存空间的大量浪费而对于链表来说可以解决这个缺点链表:是一种链式存储的线性表,所有元素的内存地址不一定是连续的链表的设计public class LinkedList<E> extends AbstractList<E>{ private static final int ELEMENT_NOT_FOUND = -1; private int size; private Node原创 2020-10-08 23:15:18 · 1067 阅读 · 0 评论