二叉排序树

1.基本应用
二叉排序树也称为也叫二叉查找树,二叉搜索树, BST。
满足二叉查找树的一般性质,是指一棵空树具有如下性质:

对于二叉树中的任何一个非叶子节点,要求左子节点比当前节点值小,右子节点比当前节点值大。
任意节点的左右子树也分别是二叉查找树.
没有键值相等的节点.
中序遍历二叉排序树得到递增有序序列

2. 局限性及应用
一个二叉排序树是由n个节点随机构成,所以,对于某些情况,二叉排序树会退化成一个有n个节点的线性链.如下图:

b图为一个普通的二叉排序树,大家看a图,如果我们的根节点选择是最小或者最大的数,那么二叉查找树就完全退化成了线性结构。
最好情况下的平均查找长度 O(log2(n))
最坏情况下的平均查找长度 O(n)

基于二叉排序树改进,又出现了AVL树,红黑树,它们两个都是基于二叉查找树,只是在二叉查找树的基础上又对其做了限制.

AVL树

1. 基本概念
相比于”二叉查找树”,它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。
和红黑树相比,它是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1)。
AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。

2.AVL树的旋转
在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡。这种失去平衡的可以概括为4种姿态:LL(左左),LR(左右),RR(右右)和RL(右左)。下面给出它们的示意图:

LL:左子树的左子树导致的失衡,其余依次类推。LL的旋转:

RR的旋转

LR的旋转

RL的旋转

3.基本应用
总结:发生问题的那个节点要成为根节点才能解决问题。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此我们可以知道AVL树适合用于插入删除次数比较少,但查找多的情况 。

AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果场景中对插入删除不频繁,只是对查找特别有要求,AVL还是优于红黑的。

应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。

平衡二叉排序树的深度 log(n+ 1) (向上取整) 或 log(n)(向下取整) +1.

红黑树

1.基本概念
一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是red或black. 通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍.它是一种弱平衡二叉树(由于是若平衡,可以推出,相同的节点情况下,AVL树的高度低于红黑树)

红黑树只追求近似平衡,所以在插入与删除节点时,翻转次数远远少于平衡树,因此在需要较多插入删除操作的场景中,使用红黑树更好。
同样也因为近似平衡,所以在查询时,红黑树查询的深度可能会大于平衡二叉树,所以在需要较多查询的场景中,使用平衡二叉树更好。

红黑树近似平衡:深度最大的节点的深度<= 2 * 深度最小的节点的深度。

为什么要有颜色,因为要满足近似平衡。

2.基本性质
再来看五条性质:

性质1 . 节点是红色或黑色。
性质2 . 根节点是黑色。
性质3 . 每个叶节点(叶节点即树尾端NUL指针或NULL节点)是黑色的。
性质4 . 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5 . 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

因为性质5,所以延伸除了近似平衡状态,试想根节点到每个叶子节点的黑色节点个数相同,而每两个红色节点之间不能直接相连,根节点又必须为黑色,红节点数小于黑节点数,所以推导出:黑色节点个数<=每条路径的总节点个数<=2倍的黑色节点数,所以最大深度与最小深度的最多相差一倍。

因为性质5,默认新插入的节点都为红色,就算有颜色冲突,也可以通过变色和旋转来修改树。

每条路径都包含相同的黑节点.

注意:红黑树的查找、删除、添加操作都为log(n)。

3. 红黑树的应用
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(logn),效率非常之高。

  1. 广泛用于C++的STL中,map和set都是用红黑树实现的.
  2. 著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块,进程的虚拟内存区域都存储在一颗红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指针指向相邻的高地址虚拟地址空间.
  3. IO多路复用epoll的实现采用红黑树组织管理sockfd,以支持快速的增删改查.
  4. ngnix中,用红黑树管理timer,因为红黑树是有序的,可以很快的得到距离当前最小的定时器.
  5. java中TreeMap的实现.

红黑树的旋转,添加节点,删除节点看下面的链接
https://www.cnblogs.com/skywang12345/p/3245399.html
注意:其中有些小错误,个人觉得有些部分的叔叔节点应该是兄弟节点,否则和图对不上,后续看到更好的解说再更换链接吧。

B树

1. 基本原理

B树是一种查找树,我们知道,这一类树(比如二叉查找树,红黑树等等)最初生成的目的都是为了解决某种系统中,查找效率低的问题。B树也是如此,它最初启发于二叉查找树,二叉查找树的特点是每个非叶节点都只有两个孩子节点。然而这种做法会导致当数据量非常大时,二叉查找树的深度过深,搜索算法自根节点向下搜索时,需要访问的节点也就变的相当多。如果这些节点存储在外存储器中,每访问一个节点,相当于就是进行了一次I/O操作(因为每一层的节点都在一个磁盘上),随着树高度的增加,频繁的I/O操作一定会降低查询的效率。所以B树就是来降低树的高度,从而减少磁盘的访问。

这里有一个基本的概念,就是说我们从外存储器中读取信息的步骤,简单来分,大致有两步:

找到存储这个数据所对应的磁盘页面,这个过程是机械化的过程,需要依靠磁臂的转动,找到对应磁道,所以耗时长。
读取数据进内存,并实施运算,这是电子化的过程,相当快。
综上,对于外存储器的信息读取最大的时间消耗在于寻找磁盘页面。那么一个基本的想法就是能不能减少这种读取的次数,在一个磁盘页面上,多存储一些索引信息。

B树的基本逻辑就是这个思路,它要改二叉为多叉,每个节点存储更多的指针信息,以降低I/O操作数。
B树也叫B-树。

2、基本结构
2.1 B树的性质

定义任意非叶子结点最多只有M个儿子;且M>2;

根结点的儿子数为[2, M];(至少有2个)

除根结点以外的非叶子结点的儿子数为[M/2, M]; (至少M/2个)

每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

非叶子结点的关键字个数=指向儿子的指针个数-1;

非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

所有叶子结点位于同一层,所有叶子节点具有相同的深度,即树的高度hhh。这表明B树是平衡的。平衡性其实正是B树名字的来源,B表示的正是单词Balanced;

一个标准的B树如下图:

图中的小红方块表示对应关键字所代表的文件的存储位置,实际上可以看做是一个地址,比如根节点中17旁边的小红块表示的就是关键字17所对应的文件在硬盘中的存储地址。

P是指针,不用多说了,需要注意的是:指针,关键字,以及关键字所代表的文件地址这三样东西合起来构成了B树的一个节点,这个节点存储在一个磁盘块上

2.2 B树的高度

最小度数t,包含n个关键字的B树的高度:

在搜索B树时,很明显,访问节点(即读取磁盘)的次数与树的高度呈正比,而B树与红黑树和普通的二叉查找树相比,虽然高度都是对数数量级,但是显然B树中log函数的底可以比2更大,因此,和二叉树相比,极大地减少了磁盘读取的次数。

B树的查找,删除,插入的详解可以看 这篇博文
https://blog.csdn.net/guoziqing506/article/details/64122287

B+树

1. B+树的定义
B+树是B树的一种变形,它更适合实际应用中操作系统的文件索引和数据库索引。
B+树是应文件系统所需而产生的一种B树的变形树(文件的目录一级一级索引,只有最底层的叶子节点(文件)保存数据.),非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中.这不就是文件系统文件的查找吗?我们就举个文件查找的例子:有3个文件夹,a,b,c, a包含b,b包含c,一个文件yang.c, a,b,c就是索引(存储在非叶子节点), a,b,c只是要找到的yang.c的key,而实际的数据yang.c存储在叶子节点上.
所有的非叶子节点都可以看成索引部分

2. B+树的性质
定义如下:(为和大多资料保持一致,这里使用阶数m来定义B+树,而不像之前的B树中,使用的是最小度t来定义)

  1. 除根节点外的内部节点,每个节点最多有m个关键字,最少有⌈m/2⌉个关键字。其中每个关键字对应一个子树(也就是最多有m棵子树,最少有⌈m/2⌉棵子树);
  2. 根节点要么没有子树,要么至少有2棵子树;
  3. 所有的叶子节点包含了全部的关键字以及这些关键字指向文件的指针,并且:
    所有叶子节点中的关键字按大小顺序排列
  4. 相邻的叶子节点顺序链接(相当于是构成了一个顺序链表)
  5. 所有叶子节点在同一层
  6. 所有分支节点的关键字都是对应子树中关键字的最大值

和B树不相同的性质

  1. 非叶子节点的子树指针与关键字个数相同;
  2. 非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树.(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复);
  3. 为所有叶子节点增加一个链指针.
  4. 所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的);
  5. 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层.
  6. 更适合于文件系统;

比如,下图就是一个非常典型的B+树的例子。

3. 基本应用   
B和B+树主要用在文件系统以及数据库做索引.比如Mysql;

B/B+树性能分析

  1. n个节点的平衡二叉树的高度为H(即logn),而n个节点的B/B+树的高度为logt((n+1)/2)+1;
  2. 若要作为内存中的查找表,B树却不一定比平衡二叉树好,尤其当m较大时更是如此.因为查找操作CPU的时间在B-树上是O(mlogtn)=O(lgn(m/lgt)),而m/lgt>1;所以m较大时O(mlogtn)比平衡二叉树的操作时间大得多。
    因此在内存中使用B树必须取较小的m.(通常取最小值m=3,此时B-树中每个内部结点可以有2或3个孩子,这种3阶的B-树称为2-3树)。

B+树和B树相比,主要的不同点在以下3项:

  1. 内部节点中,关键字的个数与其子树的个数相同,不像B树种,子树的个数总比关键字个数多1个

  2. 所有指向文件的关键字及其指针都在叶子节点中,不像B树,有的指向文件的关键字是在内部节点中。换句话说,B+树中,内部节点仅仅起到索引的作用,
    在搜索过程中,如果查询和内部节点的关键字一致,那么搜索过程不停止,而是继续向下搜索这个分支。

  3. 根据B+树的结构,我们可以发现B+树相比于B树,在文件系统,数据库系统当中更有优势 ,原因如下:

    3.1 B+树的磁盘读写代价更低
    B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说I/O读写次数也就降低了。

    3.2 B+树的查询效率更加稳定
    由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

    3.3 B+树更有利于对数据库的扫描
    B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低),所以对于数据库中频繁使用的range query,B+树有着更高的性能。

Hash树

1. hash树概述
理想的情况是希望不经过任何比较,一次存取便能得到所查的记录, 那就必须在记的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和一个唯一的存储位置相对应。因而在查找时,只要根据这个对应关系f找到 给定值K的像f(K)。由此,不需要进行比较便可直接取得所查记录。在此,我们称这个对应关系为哈希(Hash)函数,按这个思想建立的表为哈希表。

在哈希表中对于不同的关键字可能得到同一哈希地址,这种现象称做冲突。在一般情况下,冲突只能尽可能地减少,而不能完全避免。因为哈希函数是从关键字集合 到地址集合的映像。通常关键字的集合比较大,它的元素包括所有可能的关键字,而地址集合的元素仅为哈希表中的地址值。在一般情况下,哈希函数是一个压缩映像函数,这就不可避免的要产生冲突。

2. 基础理论
2.1 质数分辨定理

什么是质数 : 即只能被 1 和 本身 整除的数。

为什么用质数:因为N个不同的质数可以 ”辨别“ 的连续整数的数量,与这些质数的乘积相同。

示例、从2起的连续质数,连续10个质数就可以分辨大约M(10)=23571113171923*29= 6464693230 个数,已经超过计算机中常用整数(32bit)的表达范围。
连续100个质数就可以分辨大约M(100) = 4.711930 乘以10的219次方。

而按照目前的CPU水平,100次取余的整数除法操作几乎不算什么难事。在实际应用中,整体的操作速度往往取决于节点将关键字装载内存的次数和时间。一般来说,装载的时间是由关键字的大小和硬件来决定的;在相同类型关键字和相同硬件条件下,实际的整体操作时间就主要取决于装载的次数。他们之间是一个成正比的关系。

2.2 余数分辨定理
这个定理可以简单的表述为:n个不同的数可以“分辨”的连续整数的个数不超过他们的最小公倍数。超过这个范围就意味着冲突的概率会增加。定理1是定理2的一个特例。

3. 基于上述理论分辨算法创建哈希树
  
可以选择质数分辨算法来建立一棵哈希树。

选择从2开始的连续质数来建立一个十层的哈希树。第一层结点为根结点,根结点下有2个结点;第二层的每个结点下有3个结点;依此类推,即每层结点的子节点数目为连续的质数【1,2,3,5,7,11……】。到第十层,每个结点下有29个结点。如下图所示:
原则:求余看对应位置的结点,如果为空则在空处插入一个新节点,如果被逻辑删除了替换值再逻辑恢复,如果有值就继续往下找,继续求余判断。

示例-插入:有一组元素,按照顺序向hash树中插入元素,取余找位置插入。我们以下图中的 “68” 为例子,68先对2取余得0,但是0位置上有人了,继续对3取余得2,2得位置上也有人了,那就继续对5取余得3,3得位置上没有人则插入 到3的位置。

示例-查询:查询68,我们从2开始取余查找,找对应位置的值是否和它相同,不相同则继续向下取余,直到找到和68相同的数值或者直到为空为止。

4. 哈希树的应用
  哈希树是一种可以自适应的树。通过给出足够多的不同质数,我们总可以将所有已经出现的关键字进行区别。而质数本身就是无穷无尽的。这种方式使得关键字空间和地址空间不再是压缩对应方式,而是完全可以等价的。

哈希树可以广泛应用于那些需要对大容量数据进行快速匹配操作 的地方。
例如:数据库索引系统、短信息中的收条匹配、大量号码路由匹配、信息过滤匹配。程序员可以利用各种代码来实现哈希树结构。它可以为程序员提供一种使用起来更加方便,更加简单的快速数据存储方式。

5. 优点和缺点

优点:结构简单 注意hash树是单向增加的,即使删除也不会减少hash树的结构
查找迅速 对于int的数据 最多查找10次
结构不变 即使删除属于也不会改变结构,

缺点:非排序性 就是数据是没有顺序的

Trie树

1. 基本概念
Trie树称为字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种,常用来操作字符串。它是不同字符串的相同前缀只保存一份。相对哈希树来说,直接保存字符串肯定是节省空间的。
字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不过 Trie 的 key 只能是字符串。

Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关。Hash 表号称是 O(1) 的,但在计算 hash 的时候就肯定会是 O(k) ,而且还有碰撞之类的问题;Trie 的缺点是空间消耗很高。

Trie树的三个基本性质:
    1) 根节点不包含字符,除根节点外每一个节点都只包含一个字符;(这条和下图是不是不符合呢?)
    2) 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
    3) 每个节点的所有子节点包含的字符都不相同。
 
2. 树的构建
题目:给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置。
分析:这题当然可以用hash来解决,但是本文重点介绍的是trie树,因为在某些方面它的用途更大。比如说对于某一个单词,我们要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。
现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c,d,f之类开头的我显然不必考虑。而只要找以a开头的中是否存在abcd就可以了。同样的,在以a开头中的单词中,我们只要考虑以b作为第二个字母的,一次次缩小范围和提高针对性,这样一个树的模型就渐渐清晰了。
好比假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,我们构建的树就是如下图这样的:

如上图所示,对于每一个节点,从根遍历到他的过程就是一个单词,如果这个节点被标记为红色,就表示这个单词存在,否则不存在。
那么,对于一个单词,我只要顺着他从根走到对应的节点,再看这个节点是否被标记为红色就可以知道它是否出现过了。把这个节点标记为红色,就相当于插入了这个单词。
这样一来我们查询和插入可以一起完成(重点体会这个查询和插入是如何一起完成的,稍后,下文具体解释),所用时间仅仅为单词长度,在这一个样例,便是10。
我们可以看到,trie树每一层的节点数是26^i级别的。所以为了节省空间。我们用动态链表,或者用数组来模拟动态。空间的花费,不会超过单词数×单词长度。

3. 查找分析
在trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。而二叉查找树的查找时间和树中的结点数有关O(log2n)。
如果要查找的关键字可以分解成字符序列且不是很长,利用trie树查找速度优于二叉查找树。如:
若关键字长度最大是5,则利用trie树,利用5次比较可以从26^5=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行 log2(26 ^ 5)=23.5次比较。

3. 应用场景
  典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
  
  它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

Tire树的应用:

1. 字符串检索,词频统计,搜索引擎的热门查询
事先将已知的一些字符串(字典)的有关信息保存到trie树里,查找另外一些未知字符串是否出现过或者出现频率。

词频统计
可能有人要说了,词频统计简单啊,一个hash或者一个堆就可以打完收工,但问题来了,如果内存有限呢?还能这么玩吗?所以这里我们就可以用trie树来压缩下空间,因为公共前缀都是用一个节点保存的。

如果在trie树的node节点添加新的域 count,记录已有的单词总数。那么,Trie树除了实现单词查询之外,还可以实现单词频度统计。

举例:
1)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

2)给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。

(在这道题中,我们可以用数组枚举,用哈希,而用字典树的话,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。)

3)给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如,若rob是不良单词,那么文本problem含有不良单词。

4)1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串

5)寻找热门查询:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。

2. 字符串最长公共前缀
Trie树利用多个字符串的公共前缀来节省存储空间,反之,当我们把大量字符串存储到一棵trie树上时,我们可以快速得到某些字符串的公共前缀。举例:

  1. 给出N 个小写英文字母串,以及Q 个询问,即询问某两个串的最长公共前缀的长度是多少.
    解决方案:首先对所有的串建立其对应的字母树。此时发现,对于两个串的最长公共前缀的长度即它们所在结点的公共祖先个数,于是,问题就转化为了离线 (Offline)的最近公共祖先(Least Common Ancestor,简称LCA)问题。

    而最近公共祖先问题同样是一个经典问题,可以用下面几种方法:

    1.1. 利用并查集(Disjoint Set),可以采用采用经典的Tarjan 算法;

    1.2. 求出字母树的欧拉序列(Euler Sequence )后,就可以转为经典的最小值查询(Range Minimum Query,简称RMQ)问题了;

IP选路,也是前缀匹配,一定程度会用到trie树
搜索引擎会给予提示也是前缀匹配

3. 排序
Trie树是一棵多叉树,只要先序遍历整棵树,输出相应的字符串便是按字典序排序的结果。

举例: 给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出。
用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。

4. 作为其他数据结构和算法的辅助结构
如后缀树,AC自动机等。

详情及代码实现场参考:
https://blog.csdn.net/ts173383201/article/details/7858598
https://blog.csdn.net/hguisu/article/details/8131559
https://blog.csdn.net/leasonw/article/details/78009402

二叉排序树、AVL树、红黑树、B树、B+树、Hash树、相关推荐

  1. C++ 第八节数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)

    第一次,C++和数据结构联合推出,倾情献上呦~~ 给个关注吧 23333~~~~~~(现在每天系统就给我一个机器人的粉丝量了55555~~~~~) 本节内容,我们将着重来探讨 二叉树 中特殊的两种树- ...

  2. 《漫画算法2》源码整理-1 二分查找树 AVL树 红黑树

    二分查找树 public class BinarySearchTree {private Node root;//查找结点public Node search(int data) {Node targ ...

  3. 数据结构中的树 --- 红黑树

    红黑树是一种几近平衡的二叉搜索树, 但不是AVL树. 1 红黑树的一些特殊性质 1. 每个节点皆为红色或者黑色. 2. 根节点是黑色. 3. 每个叶子节点(NIL)是黑色(注意, 每个叶子节点必须都为 ...

  4. 【数据结构】红黑树前置知识——4阶B树

    学习目标: 学习4阶B树,使我们更好地理解为何红黑树进行平衡时的操作缘由,理清我们红黑树平衡时局部与整体的关系. 特别说明!!! 1 这里说的4阶B树是针对学习红黑树时对B树进行一定修改得到的4阶B树 ...

  5. STL源码剖析 关联式容器 树 红黑树、二叉搜索树、平衡二叉搜索树

    所谓关联式容器,观念上类似关联式数据库(实际上则简单许多):每笔数据(每个元素)都有一个键值(key)和一个实值(value) 2.当元素被插入到关联式 容器中时,容器内部结构(可能是RB-tree, ...

  6. 二叉排序树、平衡二叉树、红黑树、B树、B+树

    全民制作人们,大家好.我是练习时长两天半的个人练习册,喜欢B树 ,B+树, BST树, AVL树,来 red black  ~ 目录 一.二叉排序树(BST树) 1.1二叉排序树的定义 1.2二叉排序 ...

  7. 对AVL树和红黑树的个人理解

    都说编程算法很重要,可真没见几个.NET程序员研究算法的.这些日子非主流地研究了一些小算法,红黑树和AVL树算是其中复杂的了,但实际也就二三百行代码.悲催的是,网上根本找不到C#的理想版本(包括国外网 ...

  8. BST AVL 红黑树 B B+树

    二叉搜索树(BST) 简明BST递归定义(Knuth Donald): 对于任意一个节点均满足: 1. 所有位于左子树的节点值均比该节点值小 2. 所有位于右子树的节点值均大于等于该节点值 3. 所有 ...

  9. Linux内核之于红黑树and AVL树

    为什么Linux早先使用AVL树而后来倾向于红黑树?        实际上这是由红黑树的实用主义特质导致的结果,本短文依然是形而上的观点.红黑树可以直接由2-3树导出,我们可以不再提红黑树,而只提2- ...

最新文章

  1. 超越BN-ReLU!谷歌大脑等提出EvoNorms:归一化激活层的进化
  2. datatables
  3. 简单粗暴的canvas图片压缩
  4. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )
  5. 剑指Offer_29_最小的K个数
  6. 覆盖所有面试知识点,赶紧收藏!
  7. 【算法系列之十四】最大子序和
  8. 华为证实 P40 将没有 Google 服务;李世石退役;Python 3.8.1 发布 | 极客头条
  9. 斐波那契数列连续十项的和
  10. php写幻灯片,原生JS写的幻灯片
  11. Iris数据集可视化
  12. DOSBOX 安装与使用
  13. 计算机硬盘的常用分区工具,常用的几款分区合并工具推荐,合理使用电脑硬盘...
  14. 基于海康威视IP摄像头和虹软的MFC人脸识别系统开发教程
  15. 计算机高级职称考试报考条件,高级工程师证怎么考 报考条件
  16. 10种经典的日内交易策略模型思路
  17. 爱因斯坦广义相对论: 质量/能量物体是如何影响时空的?
  18. OrCAD Capture CIS 16.6 - 为元器件添加属性
  19. Java基础:数据类型的扩展
  20. Chrome在Win下的跨域解决方案

热门文章

  1. python+html实现前后端数据交互界面显示
  2. Cerebral Cortex:疼痛热刺激引起的脑功能网络分离与整合
  3. 微型计算机机安装硬盘教程,装机DIY之硬盘安装方法 不同硬盘安装方法图解教程...
  4. Designing Specification
  5. 05流量管理原理-3金丝雀TCP流量整形比例分配
  6. Windows——如何关闭笔记本自带键盘
  7. 改写二分搜索算法C++
  8. 10 Java基础笔记-封装
  9. Java中的七种设计原则
  10. 记一次抗DDOS演练