数据结构 - 红黑树(Red Black Tree)删除详解与实现(Java)

本篇要讲的就是红黑树的删除操作 红黑树插入操作请参考 数据结构 - 红黑树(Red Black Tree)插入详解与实现(Java) 红黑树的删除是红黑树操作中比较麻烦且比较有意思的一部分。 在此之前,重申一遍红黑树的五个定义: 1. 红黑树的节点要不是黑色的要不是红色的 2. 红黑树的根节点一定是 ... »

十三、智能指针二

1、 智能指针重构 需求:使用智能指针 替换单链表 中的原生指针 将原生指针更改为智能指针后,解决全部的编译问题,程序还是会出错,问题在于: 的设计方案 指针的生命周期结束时主动释放堆空间 一片堆空间最多只能有一个指针标识 不允许指针运算和指针比较 需求:创建新的指针指针 是智能指针的抽象父类(模板 ... »

链表检测环算法,找到环中的出口节点

如何判断一个链表有环 方法是使用快慢指针,通过一个slow指针(每次都指向下一个),一个quick指针(每次都指向下面两个) 因为假设有环的话,quick会追上slow指针 找到环出口就是通过slow指针指向头节点,quick指针指向之前环的交叉点,然后一直以不同速度遍历直到相遇 这样找到的就是出口 ... »

数据结构及算法学习(一)

一、数据结构范畴 数据结构是一门与程序设计密切相关的课程,而程序设计就是算法+数据结构,算法即是处理数据的策略,而数据结构就是表达程序设计的模型,可以说任何一个程序设计问题,我们都可以从算法和模型出发。概而言之,数据结构就是描述了程序设计的数学模型及在其程序设计上的表示和实现。 二、基本概念 (1) ... »

【算法】C++用链表实现一个箱子排序附源代码详解

01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O(n)。 1.2 什么是箱子排序? 箱子排序是分配排序的一种,箱子排序也称桶排序(Bucket Sort),其基本思想是:设置若干个箱子,依 ... »

左式堆

注:这里的堆还是以小根堆为例。 我们想要设计一种堆能像二叉堆那样高效地支持合并操作,也就是$Oleft( n ight)$时间处理一次Merge,而且只使用一个数组看起来很困难对吧,毕竟合并操作需要把一个数组复制到另外一个数组中去,对于相同大小的堆这会花费$ heta left( n ... »

数据结构 - 从二叉搜索树说到AVL树(二)之AVL树的操作与详解(Java)

写在前:我在尽可能的写一篇能比较清晰且完整的讲完整个AVL树操作的文章,所有文字以及例图都是我一笔一划写出来的。由于AVL树的操作包含了查找,删除,插入操作,除了一些规律之外,一些处理细节,比如旋转操作,失衡时候的调整步骤等,除了死记硬背没有别的办法,所以我建议读者可以拿起笔,集中精神,跟着思路一口 ... »

十二、典型问题分析

问题1:创建异常对象时的空指针问题 创建一个空指针异常对象,意味着这会调用父类的构造函数 ,然后调用 ,然后调用 , 缺陷:没有处理参数为空指针的情况,默认为参数不能为空。 参数为空指针的情况应该合法,空指针作为字符串的一个特殊值,是有意义的,如果要复制的字符串是一个空指针,只需要返回一个空指针就可 ... »

二叉堆

二叉堆是一种典型的优先队列实现策略,广义而言,堆是优先队列的实现方式,在此之下又分为二叉堆,左式堆,斜堆,二项队列等具体形态。但第一个用得太普遍了,所以我们平时一说到堆(Heap)指的就是二叉堆。基本模型如下,基本操作就这两个,其他的都是扩展。 以后我们讨论的堆,如果不特殊说明,那都以小顶堆为例,堆 ... »

二叉堆 动机与特性分析

二叉堆是一种典型的优先队列实现策略,广义而言,堆是优先队列的实现方式,在此之下又分为二叉堆,左式堆,斜堆,二项队列等具体形态。但第一个用得太普遍了,所以我们平时一说到堆(Heap)指的就是二叉堆。基本模型如下,基本操作就这两个,其他的是扩展。 以后我们讨论的堆,如果不特殊说明,那都以小顶堆为例,堆顶 ... »

图算法--最短路径算法的实现与应用

最短路径 在解决网络路由的问题中,寻找图中一个顶点到另一个顶点的最短路径或最小带权路径是非常重要的过程。 正式表述为,给定一个有向带权图G=(V,E),顶点s到V中顶点t的最短路径为在E中边的集合S中连接s到t代价最小的路径。 当找到S时,我们就解决了单对顶点最短路径问题。要做到这一点,实际上首先要 ... »

红黑树——首身离兮心不惩

最后我们来探究红黑树的删除算法,相比插入操作,它的情况更复杂一些。因此直接考虑很容易撞到南墙,我们更需要利用转化与化归的思想(还记得高中数学四大思想方法吧,这里一样适用),通过提升变化,把红黑树映射成一颗B-树,并站在后者的角度,反过来理解前者的原理。但我们更需要关心重构操作,也就是一系列的旋转和修 ... »

十一、静态单链表的实现

1、静态单链表的提出 需要频繁增删数据元素,可以选择单链表,如果数据元素的最大个数是固定的,可能需要一种新的数据结构 单链表的一个缺陷 触发条件:长时间使用单链表对象频繁增删数据元素 可能结果:堆空间产生大量的内存碎片,导致系统运行缓慢 原因:每增加一个数据元素,都会在堆空间中创建一个数据结点,程序 ... »

红黑树——以无厚入有间(插入)

首先说一下,关于红黑树有一篇很棒的论文《A dichromatic framework for balanced trees》,作者之一的Robert Sedgewick,想必大家不会陌生。如果有兴趣可以仔细研读一下,里面讲了更多细节的分析,而本文也借鉴了其中的一些思路和配图。 回顾一下之前的结构分 ... »

ACM 2018 南京网络赛H题Set解题报告

题目描述 给定(n)个数$a_i$,起初第(i)个数在第(i)个集合。有三种操作(共(m)次): 1 $u$ $v$ 将第$u$个数和第$v$个数合并 2 $u$ 将第$u$个数所在集合所有数加1 3 $u$ $k$ $x$ 问$u$所在集合有多少个数模$2^k$余$x$。 数据范围 ... »

C++实现二叉树的相应操作

1. 二叉树的遍历:先序(递归、非递归),中序(递归、非递归),后序(递归、非递归)。 2. 获取二叉树节点个数: 3. 判断二叉树是否为完全二叉树: 4. 求二叉树两个节点的最小公共祖先: 5. 二叉树的翻转: 6. 求二叉树第k层的节点个数: 7. 求二叉树中节点的最大距离(相距最远的两个节点之 ... »

javascript数据结构——栈

栈是一种高效的数据结构,数据只能在栈顶添加或删除,所以这样操作很快,也很容易实现。栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用。接下来,用JavaScript实现一个栈的数据结构。 定义栈的操作 栈作为一种特殊的列表,只能从一端来进行访问,就像一摞盘子,放只能放在上面,拿也只能从上 ... »

数据结构(java版)学习笔记(四)——线性表之循环链表

单向循环链表 PS:有阴影的结点是头结点 概念: 最后一个结点的链域值不为NULL,而是指向头结点 特点: 从表中的任意结点出发,都可以找到表中其他结点 循环条件 p==h 双向链表 概念 链表中的每一个结点有两个指针域,一个指向前趋,另外一个指向后继 双向循环链表 概念 双向链表中的头结点的前趋指 ... »