首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

整理得吐血了,二叉树、红黑树、B&B+树超齐全,快速搞定数据结构

AVL树的特点 具有二叉查找树的特点(左子树任一节点小于父节点,右子树任一节点大于父节点),任何一个节点的左子树与右子树都是平衡二叉树 任一节点的左右子树高度差小于1,即平衡因子为范围为[-1,1] 如上左图根节点平衡因子...节点插入、旋转 AVL树插入节点的如下: 根据BST入逻辑将新节点插入树中 从新节点往上遍历检查每个节点的平衡因子,若发现有节点平衡因子不在[-1,1]范围内(即失衡节点u),则通过旋转重新平衡以u为根的子树...对删除节点D根据BST规则执行删除 选择平衡,该步骤与插入区别不大,从D节点往上遍历检查每个节点的平衡因子,若发现有节点失衡,则通过旋转重新平衡以u为根的子树 例子: ?...Tree) 红黑树是一种自平衡二叉搜索树(BST),且红黑树节点遵循以下规则: 每个节点只能是红色或黑色 根节点总是黑色的 红色节点的父或子节点都必然是黑色的(两个红色的节点不会相连) 任一节点到其所有后代...具体的搜索步骤如下: 将搜索值与树中根节点的第一个key进行比较 匹配则显示“找到给定节点”并结束搜索,否则进入步骤3 检查搜索值是大于还是小于当前key值 搜索值小于当前key:左子树中获取第一个key

3.1K21

数据结构:树结构

因此,在插入一个新结点后,需要从插入位置沿通向根的路径回溯,检查各结点的平衡因子。...(由于每个结点的平衡因子由其左右子树决定,插入路径外堆结点堆左右子树均不发生变化,所以平衡因子不会发生改变) 1、平衡化旋转 1)左单旋L 沿插入路径检查三个结点A、C和E。...2、平衡因子更新 根据平衡树的定义,平衡树上所有结点的平衡因子的绝对值都不超过1。在插入结点之后,若查找树上某个结点的平衡因子的绝对值大于1,则说明出现不平衡。...同时,插入的结点只能影响其祖先结点的平衡因子; 当某个平衡因子从0变成1或者-1,需要继续调整祖先结点的平衡因子,直到根节点; 当某个平衡因子从-1或者1变成0,则不需要调整祖先的平衡因子了,因为平衡因子在插入数据之后变成...3、删除 当删除的结点不是叶结点,需要找到被删除结点的前驱/后继结点,将其填充进去,并删除该前驱/后继结点。 删除结点后需要调整平衡。

2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据结构–查找专题

    静态查找: 查询某个特定的元素,检查某个特定的数据元素的属性,不插入新元素或删除元素(记录) 。 动态查找: 在查找过程中,同时插入查找表中不存在的数据元素(记录)。...小的往左走,大的往右走,遇到NULL就插入 ASL计算:同查找树 存储结构:跟二叉树一样 查找算法:大的往右,小的往左,找到了返回,遇到NULL就失败 插入算法: 删除算法:在二叉排序树中删除一个结点时...为保证在删除节点后二叉排序树的性质不会丢失: 1、删除叶结点,只需将其双亲结点指向它的指针置空,再释放它即可。...3、被删结点左、右子树都存在,可以在它的右子树中寻找中序下的第一个结点(关键值最小),用它的值填补到被删结点中,再来处理这个结点的删除问题。...结点的平衡因子:结点的左右子树的深度之差。 平衡二叉树:任意结点的平衡因子的绝对值小于等于1的二叉树。

    48620

    算法原理系列:2-3查找树

    分配权 为什么BST会失去分配权力?因为它没有可以权衡的信息,在BST中,每个节点只能存储了一个key,每当有新的节点插入时,进行比较后,就自动选择路径到它的子树中去了,它无法停留。...数据结构有了,我们先来看看它的查找,暂且忽略它是怎么构建的。我们只需要知道两个事实,每个节点最多可以存储两个键,三个分叉。...如:我找三个树的中间值,把它变成三个节点的BST树!相比于直接把下一节点插入到子树中去,它利用了两个元素的信息做了些调整,而调整后的树,是个平衡的二叉树。...向一棵只含有一个3-节点的树中插入新键。(树的初始态) 向一个父节点为2-节点的3-节点中插入新键。(子树的分裂1) 向一个父节点为3-节点的3-节点中插入新建。(子树的分类2) 分解根节点。...我们需要维护两种不同类型的节点,将被查找的键和节点中的每个键进行比较,将链接和其他信息从一种节点复制到另一种节点,将节点从一种数据类型转换到另一种数据类型,等等。

    89320

    重学数据结构(六、树和二叉树)

    在链式存储结构里,我们需要对节点进行定义,每个节点包含数据、左孩子、右孩子。 图6:二叉树链式存储节点示意图 ? 左孩子指向节点的左孩子,右节点指向节点的右孩子。 图7:二叉树的二叉链表表示 ?...调整方法是:找到离插入结点最近且平衡因子绝对值超过1的祖先结点, 以该结点为根的子树称为最小不平衡子树, 可将重新平衡的范围局限千这棵子树。 在平衡调整的过程中,有一个关键点是旋转。...只不过 AVL 树在删除节点后需要重新检查平衡性并修正,同时,删除操作与插入操作后的平衡修正区别在于,插入操作后只需要对插入栈中的弹出的第一个非平衡节点进行修正,而删除操作需要修正栈中的所有非平衡节点...根节点最少可以只有1个关键字。 * 非根节点至少有m/2个关键字。 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。...非叶子节点不存储数据,只存储索引,数据都存储在叶子节点。 非叶子结点中的key都按照从小到大的顺序排列,对于非叶子结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。

    81311

    数据结构与算法——2-3树

    前言 前面讲到了二叉搜索树 (BST) 和二叉平衡树 (AVL) ,二叉搜索树在最好的情况下搜索的时间复杂度为 O(logn) ,但如果插入节点时,插入元素序列本身就是有序的,那么BST树就退化成一个线性表了...如果想要减少比较次数,就需要降低树的高度。在插入和删除节点时,要保证插入节点后不能使叶子节点之间的深度之差大于 1,这样就能保证整棵树的深度最小,这就是AVL 树解决 BST 搜索性能降低的策略。...但由于每次插入或删除节点后,都可能会破坏 AVL 的平衡,而要动态保证 AVL 的平衡需要很多操作,这些操作会影响整个数据结构的性能,除非是在树的结构变化特别少的情形下,否则 AVL 树平衡带来的搜索性能提升有可能还不足为了平衡树所带来的性能损耗...img 向一个父节点为 2- 节点的 3- 节点中插入新节点 操作步骤:先构造一个临时的 4- 节点并将其分解,分解时将中键移动到父节点中(中键移动后,其父节点中的位置由键的大小确定) 图解: ?...img 向一个父节点为3-节点的3-节点中插入新节点 操作步骤:插入节点后一直向上分解构造的临时4-节点并将中键移动到更高层双亲节点,直到遇到一个-2节点并将其替换为一个不需要继续分解的3-节点,或是到达树根

    66510

    深入理解AVL树:结构、旋转及C++实现

    更新平衡因子:从插入节点开始,向上遍历其祖先节点,更新每个节点的平衡因子。 检查并旋转平衡树:如果某节点的平衡因子变为2或-2,说明该节点失衡。此时需要通过旋转操作恢复平衡。...同步验证平衡因子:在递归计算高度的过程中,我们需要同时验证每个节点的平衡因子是否正确。...进阶:检查树的平衡因子及其更新的正确性 除了检测平衡性之外,还可以扩展检测模块,进一步确保AVL树中的每个节点的平衡因子在插入和旋转操作之后都得到了正确更新。以下是检测平衡因子的代码。...验证每个节点的平衡因子 在进行插入、删除等操作后,平衡因子必须保持正确更新。我们可以通过递归遍历整棵树来验证每个节点的平衡因子是否准确反映其子树的高度差。...这种检测可以在每次插入、删除或旋转之后调用,以确保树在操作后没有出现错误的平衡因子。 如果发现平衡因子不正确,程序会输出详细的错误信息,包括节点的键值、应有的平衡因子和当前存储的平衡因子。

    10010

    三分钟基础知识:什么是 2-3 树?

    二叉搜索树在最好的情况下搜索的时间复杂度为 O(logn) ,但如果插入节点时,插入元素序列本身就是有序的,那么BST树就退化成一个线性表了,搜索的时间复杂度为 O(n)。...如果想要减少比较次数,就需要降低树的高度。在插入和删除节点时,要保证插入节点后不能使叶子节点之间的深度之差大于 1,这样就能保证整棵树的深度最小,这就是AVL 树解决 BST 搜索性能降低的策略。...但由于每次插入或删除节点后,都可能会破坏 AVL 的平衡,而要动态保证 AVL 的平衡需要很多操作,这些操作会影响整个数据结构的性能,除非是在树的结构变化特别少的情形下,否则 AVL 树平衡带来的搜索性能提升有可能还不足为了平衡树所带来的性能损耗...img 向一个父节点为 2- 节点的 3- 节点中插入新节点 操作步骤:先构造一个临时的 4- 节点并将其分解,分解时将中键移动到父节点中(中键移动后,其父节点中的位置由键的大小确定) 图解: ?...img 向一个父节点为3-节点的3-节点中插入新节点 操作步骤:插入节点后一直向上分解构造的临时4-节点并将中键移动到更高层双亲节点,直到遇到一个-2节点并将其替换为一个不需要继续分解的3-节点,或是到达树根

    71220

    打牢地基-拿下红黑树

    红黑树的简单定义: 1.1 基本特性 算法导论对红黑树的定义有一定弊端,上来直接看定义,会懵 1. 每个节点或者是红色的,或者是黑色的 2. 根节点一定是黑色的 3....新入节点如果打破了2-3树的定义(加入节点后节点中存储了>2个的元素),则中间节点上移成为根节点 1.3.3 2-3树和红黑树是等价的 ?...因为我们定义的树结构不会用具体的对象去定义节点连接的边,所以我们将3节点中的较小元素的节点用红色表示,其在较大元素节点的左边,并且表示为红色。如下图所示: ? 红黑树中红色节点的由来: ?...红黑树不是AVL树,但是是保持黑平衡的二叉树(节点的左右黑子树高度差 <= 1) 1.3.4 红黑树的代码定义(对BST树进行改造) 1.3.4.1 定义红黑树的节点颜色 """ # @Time...,保证2-3 树的3节点对应红黑树的表示成立, 在我们的定义中, 红色节点均在父亲节点的左侧 :param node: 返回左旋转,对根节点的反转

    39130

    数据结构(四):平衡二叉树(AVL树)

    ,所以对二叉搜索树中每个节点的左右子树作了限制,左右子树的高度差称之为平衡因子,树中每个节点的平衡因子绝对值不大于 ,此时二叉搜索树称之为平衡二叉树。...情景分析 在执行插入或删除节点操作后,平衡因子绝对值变为大于 的情况,即左右子树的高度差为 或 的情况,可以归纳为如下四种: 左左情况(LL) 情况是指根节点的平衡因子为 ,根节点的左子节点平衡因子为...平衡操作中的旋转操作复杂度为常数级别,递归执行的次数则依赖于树的高度(可以优化为当前节点平衡因子不发生变化,则取消向上递归)。所以平衡二叉树中查询、插入和删除节点操作的复杂度依赖于树高。...平衡二叉树因为左右子树的平衡因子限制,所以不可能存在类似于斜树的情况,因为任一节点的左右子树高度差最大为一,且二叉树具有对称性,所以不妨设每个子树的左子树高度大于右子树高度。...所以相对于二叉搜索树,平衡二叉树避免了向线性结构演化的倾向,查询、插入和删除节点的时间复杂度为 ~ 。因为每个节点上需要保存平衡因子,所以空间复杂度要略高于二叉搜索树。

    1.3K30

    平衡二叉树(AVL树)

    ,所以对二叉搜索树中每个节点的左右子树作了限制,左右子树的高度差称之为平衡因子,树中每个节点的平衡因子绝对值不大于1,此时二叉搜索树称之为平衡二叉树。...情景分析在执行插入或删除节点操作后,平衡因子绝对值变为大于1的情况,即左右子树的高度差为2或-2的情况,可以归纳为如下四种:左左情况(LL)LL情况是指根节点的平衡因子为2,根节点的左子节点平衡因子为0...平衡调节过程中可能存在旋转操作,递归执行的次数则依赖于树的高度(可以优化为当前节点平衡因子不发生变化,则取消向上递归)。所以平衡二叉树中查询、插入和删除节点操作的复杂度依赖于树高。...平衡二叉树因为左右子树的平衡因子限制,所以不可能存在类似于斜树的情况,因为任一节点的左右子树高度差最大为一,且二叉树具有对称性,所以不妨设每个子树的左子树高度大于右子树高度。?...因为每个节点上需要保存平衡因子,所以空间复杂度要略高于二叉搜索树。

    1K10

    我的思念像满二叉树般疯长,每个空指针都指向你的方向——全程动画可视化数据结构算法之二叉树

    ,访问该结点,并将其左、右孩子插入队尾(如果有的话) 重复第三步直至队列为空 代码实现:​ // 定义二叉树节点结构体,采用链式存储,每个节点存储一个字符类型的数据 typedef struct...,不可能是后继 方法1:用土办法从头开始先序遍历 方法2:可以改用三叉链表以找到父结点 ​ 树的储存结构 双亲表示法之顺序存储: 每个结点中保存指向双亲的“指针”,data,parrent...结点的平衡因子=左子树高-右子树高 平衡二叉树结点的平衡因子的值只可能是−1、0或1 只要有任一结点的平衡因子绝对值大于1,就不是平衡二叉树 平衡二叉树(AVL-RR/RL/LL/LR...二叉排序树的特性:左子树结点值< 根结点值< 右子树结点值 LL平衡旋转(右单旋转) 由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡...,而B的原左子树则作为A结点的右子树 右旋(RR)和左旋(LL)的代码实现思路 LR平衡旋转(先左后右双旋转) 由于在A的左孩子(L)的右子树(R)上插入新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡

    6800

    数据结构与算法夺命连环17问

    AVL树的性质∶左子树和右子树的高度之差的绝对值不超过1树中的每个左子树和右子树都是AVL树每个节点都有一个平衡因子(balance factor-bf),任一节点的平衡因子是1,0,1之一(每个节点的平衡因子...(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 这些特性使得红黑树中从根节点到叶子节点的最长路径不会超过最短路径的两倍 红黑树通过变色...5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是个孩子包含的元素的值域分划。...2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。...: 1.单一节点存储更多的元素,使得查询的IO次数更少。

    36020

    基本算法|图解各种树(三)

    基本算法|图解各种树(一) 二叉树是二维的链表,当二叉树实现了sorted vector的接口后,它变为了有序二叉树,或二叉搜索树,BST,它的任一节点不小于/不大于其左/右后代。...基本算法|图解各种树(二) BST也会退化为单链,也就是会失去平衡性,为了解决这个问题,提出了一种保证平衡的策略: 某个节点的左右子树的高度差不大于1,这是一种适度平衡的策略,AVL就是这样一种适度平衡的实现方法...2 删除操作 1)单旋 删除T3子树下的某个节点后,导致g节点的平衡因子变为+2,失衡,需要绕g节点做一次zig调整。 ? 调整后变为如下: ?...p节点局部平衡了,是不是代表整体一定平衡了呢?未必!如果T2下圈起的节点存在,则整体就平衡了。 ?...p的某个祖先平衡因子本为-1,如果,T2下的节点不存在,那么调整后这个祖先的平衡因子变为-2,因此,需要进一步检查p的祖先的平衡因子。这是删除操作所特有的失衡传播。 ?

    73350

    【算法】论平衡二叉树(AVL)的正确种植方法

    二叉搜索树查找的原理和二分查找类似,就是借助于它本身的结构,在遍历查找的过程中跳过一些不必要的结点的比较,从而实现高效的查找。 BST的其他API也是借助了这一优势实现性能的飞跃。...在二叉树中, 我们为每个结点定义了平衡因子这个属性。 平衡因子: 某个结点的左子树的高度减去右子树的高度得到的差值。 平衡二叉树(AVL): 所有结点的平衡因子的绝对值都不超过1。...上面我们说到, 在动态操作(插入/删除)的过程中,我们需要平衡因子作为“指标”, 去监督当前这颗二叉树的构造是否符合预期, 即——是否是一颗平衡二叉树。...而平衡因子BF的计算需要用到该节点的孩子结点的高度属性, 这也就意味着, 我们要从Node类的实例变量入手,为每个结点设置height属性, 并在二叉树结构发生变化时, 更新并维护height的正确性。...计算BF以监督平衡二叉树的状态 只要我们能正确地维护每个结点的height, 我们就能对动态操作中受影响的结点,准确计算其平衡因子(BF), 从而判断当前的平衡二叉树的状态 计算某个结点平衡因子的方法:

    85620

    【算法】论平衡二叉树(AVL)的正确种植方法

    二叉搜索树查找的原理和二分查找类似,就是借助于它本身的结构,在遍历查找的过程中跳过一些不必要的结点的比较,从而实现高效的查找。 BST的其他API也是借助了这一优势实现性能的飞跃。...在二叉树中, 我们为每个结点定义了平衡因子这个属性。 平衡因子: 某个结点的左子树的高度减去右子树的高度得到的差值。 平衡二叉树(AVL): 所有结点的平衡因子的绝对值都不超过1。...上面我们说到, 在动态操作(插入/删除)的过程中,我们需要平衡因子作为“指标”, 去监督当前这颗二叉树的构造是否符合预期, 即——是否是一颗平衡二叉树。...而平衡因子BF的计算需要用到该节点的孩子结点的高度属性, 这也就意味着, 我们要从Node类的实例变量入手,为每个结点设置height属性, 并在二叉树结构发生变化时, 更新并维护height的正确性。...计算BF以监督平衡二叉树的状态 只要我们能正确地维护每个结点的height, 我们就能对动态操作中受影响的结点,准确计算其平衡因子(BF), 从而判断当前的平衡二叉树的状态 计算某个结点平衡因子的方法:

    1K110

    数据结构:查找

    B树能做到,而AVL与BST却做不到。 水平方向:对应与每个节点的内部搜索,在内存(RAM)中进行。 垂直方向:对应于磁盘(Disk)操作。树中每下降一层,就要付出一次IO操作的代价。...,则至少有两颗子树 所有的叶子节点都出现在同一层次上,并且不带信息(可以看作是外部结点或者类似于折半查找判定树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空) B树是所有节点的平衡因子均等于...B树查找 B树查找包含两个基本操作: 在B树中找结点 在结点上找关键字 由于B树常存储在磁盘上,则前一个查找是在磁盘上进行的,而后一个查找操作是在内存中进行的,即在找到目标结点后,先将结点中的信息读入内存...当插入后的结点关键字个数小于m,则可以直接插入;插入后检查被插入结点内关键字的个数,当插入后的结点关键字个数大于m-1时,则必须对结点进行分裂 分裂的方法是:取一个新结点,将插入key后的原结点从中间位置将其中的关键字分为两部分...B+树的优势: 单一节点存储更多的元素,使得查询的IO次数更少。 所有查询都要查找到叶子节点,查询性能稳定。 所有叶子节点形成有序链表,便于范围查询。

    3.4K51

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树

    1.AVL 树 1.1AVL 树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。...因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右 子树高度之差的绝对值不超过...1.新节点插入较高右子树的右侧---右右:左单旋  由上述可知,c必定是x类型的avl树,如果是其他类型的,可能60这个节点的平衡因子就变成-2或2了,(当然,这只是单独举一个例子分析,便于分析代码,...验证其为平衡树 (1)每个节点子树高度差的绝对值不超过1(注意节点中如果没有平衡因子) (2)节点的平衡因子是否计算正确 void inorder() { _inorder(root);...AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这 样可以保证查询时高效的时间复杂度,即$og_2 (N)。

    7410

    九种查找算法

    ,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。...左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;右节点也是一个2-3节点,节点的所有key值比两个key中的最大的...算法思路: 要判断一个键是否在树中,我们先将它和根结点中的键比较。如果它和其中的任何一个相等,查找命中。否则我们就根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归地继续查找。...对于2节点,保持不变;对于3节点,我们首先将3节点中左侧的元素标记为红色,然后我们将其改造成图3的形式; 再将3节点的位于中间的子节点的父节点设置为父节点中那个红色的节点,如图4的所示;最后我们将图4的形式改为二叉树的样子...~bst(); getchar(); return 0; } 9 B树/B+树 在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找

    67920

    九种查找算法

    ,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。...左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;右节点也是一个2-3节点,节点的所有key值比两个key中的最大的...算法思路: 要判断一个键是否在树中,我们先将它和根结点中的键比较。如果它和其中的任何一个相等,查找命中。否则我们就根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归地继续查找。...对于2节点,保持不变;对于3节点,我们首先将3节点中左侧的元素标记为红色,然后我们将其改造成图3的形式; 再将3节点的位于中间的子节点的父节点设置为父节点中那个红色的节点,如图4的所示;最后我们将图4的形式改为二叉树的样子...~bst(); getchar(); return 0;} 9 B树/B+树 在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找

    1.1K53
    领券