二叉搜索树

满足以下条件:

  1. 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值。
  2. 任意节点的左、右子树也是二叉搜索树,即同样满足条件 1.

这是一个正常的,没有碰到极端情况的二叉搜索树。

如果数据是有序的或者在删除,插入操作下,那么可能会退化成一条链。严重影响性能。

平衡二叉搜索树(AVL)

在这种情况下可以通过不同的旋转操作来保证树的平衡。

  • “节点高度”是指从该节点到它的最远叶节点的距离,即所经过的“边”的数量。
  • 节点的平衡因子(balance factor)定义为节点左子树的高度减去右子树的高度,同时规定空节点的平衡因子为 0 。
  • 我们将平衡因子绝对值 >1 的节点称为“失衡节点”

旋转

旋转操作是为了将二叉树重新平衡。

在插入或删除的时候,如果节点失衡,平衡因子的绝对值只能是2。

57 是失衡节点。它们失衡是因为 1 的存在,从节点 51 有两条边,这是罪魁祸首,只要把 3 作为 15 的父节点就好了。

但是为什么不把 5 作为 37 的父节点呢?找离新插入的节点最近的不平衡的树进行调整

为什么要这么操作呢?

  • AVL树的平衡性是递归定义的。每个节点的左右子树高度差不能超过1。

  • 如果只调整离新插入节点最近的不平衡节点,可以确保该节点的子树恢复平衡,同时更高层的节点也会因为子树高度的调整而自动满足平衡条件。

  • 如果跳过最近的不平衡节点,直接调整更高层的节点,可能会导致低层节点再次失衡,从而需要额外的调整。

    对于其它的旋转操作来说,都是为了保证 AVL 树的性质不变。

红黑树

  • 特性1:节点非黑即红

  • 特性2:根节点一定是黑色

  • 特性3:叶子节点(NIL)一定是黑色

  • 特性4:每个红色节点的两个子节点都为黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

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

    从以上性质可以知道左右子树的高度差最大的时候是黑红相间,这样的规定使得调整平衡的操作相对于 AVL 比较少。

插入

  • 规定插入的节点是红节点,如果是黑节点一定破坏了 特性5,而红节点有可能破坏 特性4.

叔叔为红

只好将 7 变红,39 变黑,同时将注意力放到 7 上递归向上。

叔叔为黑

只需要保证这棵子树的父节点为黑,并满足上述性质。

3 变黑,通过旋转,变为父节点,7 变红。

删除

  • 如果是红色节点没有任何问题直接删除,如果是黑色节点则必定会违反 特性5.

    如果删除后,将兄弟子树也去掉一个黑色节点,就要将注意力转移到它们的父节点上,递归向上。



    删掉 93 变红,压力给到 7.

    如果要保持黑节点不变,就要旋转加变色,来保证红黑树的性质。

B树

可以知道的是上述 AVL 树和红黑树的高度较高,如果数据量较大的情况下,数据在硬盘上,访问一个节点时要进行一次硬盘操作。树高度和访问硬盘的操作正相关。所以我们要压缩树的高度,增加每个节点数据量。

  • 平衡:所有叶节点都在同一层。
  • 有序:节点内有序,任意元素的左子树小于它,右子树大于它。
  • 对于m阶B树,节点最多有m个分支,m-1个元素。对于根节点,最少2个分支,一个元素,非根 $[m/2]$ 个分支,$[m/2] -1$个元素。



    B树的插入删除操作和二叉搜索树的相似同时要满足节点最少和节点最大的条件,就不过多讨论。

B+树

  • 与B树的不同:对于m阶B树,节点最多有m个分支,m个元素。对于根节点,最少2个分支,两个个元素,非根 $[m/2]$ 个分支,$[m/2]$个元素。



    B树在顺序遍历的时候只能中序遍历,远没有B+树链式遍历的快。同样的 B+树也可以很方便的进行随机查找。

红黑树和b+树的更多相关文章

  1. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  2. 红黑树、B(+)树、跳表、AVL等数据结构,应用场景及分析,以及一些英文缩写

    在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...

  3. 红黑树和AVL树的实现与比较-----算法导论

    一.问题描述 实现3种树中的两种:红黑树,AVL树,Treap树 二.算法原理 (1)红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black.红黑树满足以 ...

  4. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树

    B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...

  5. 红黑树与AVL树

    概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...

  6. AVL树与红黑树(R-B树)的区别与联系

    AVL树(http://baike.baidu.com/view/593144.htm?fr=aladdin),又称(严格)高度平衡的二叉搜索树.其他的平衡树还有:红黑树.Treap.伸展树.SBT. ...

  7. 1.红黑树和自平衡二叉(查找)树区别 2.红黑树与B树的区别

    1.红黑树和自平衡二叉(查找)树区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单. 2.平衡 ...

  8. 二叉树、红黑树、伸展树、B树、B+树

    好多树啊,程序猿砍树记,吼吼. 许多程序要解决的关键问题是:快速定位特定排序项的能力. 第一类:散列 第二类:字符串查找 第三类:树算法 树算法可以在辅助存储器中存储大量的数据. 二叉树.红黑树和伸展 ...

  9. AVL树,红黑树,B-B+树,Trie树原理和应用

    前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作 ...

  10. B树、B+树、红黑树、AVL树

    定义及概念 B树 二叉树的深度较大,在查找时会造成I/O读写频繁,查询效率低下,所以引入了多叉树的结构,也就是B树.阶为M的B树具有以下性质: 1.根节点在不为叶子节点的情况下儿子数为 2 ~ M2. ...

随机推荐

  1. Qt编写地图综合应用58-兼容多浏览器内核

    一.前言 miniblink是一个追求极致小巧的浏览器内核项目,全世界第三大流行的浏览器内核控件.其基于chromium最新版内核,去除了chromium所有多余的部件,只保留最基本的排版引擎blin ...

  2. Qt通用方法及类库10

    函数名 //获取保存的文件 static QString getSaveName(const QString &filter, QString defaultDir = QCoreApplic ...

  3. opencv_contrib编译:fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory

    在Ubuntu上编译opencv3.4.2源码时,遇到下面的错误,错误1:/home/src/software/opencv-3.4.2/modules/stitching/include/openc ...

  4. d2go使用总结

    d2go使用总结 安装 PyTorch Nightly 安装 PyTorch Nightly(以 CUDA 10.2 为例,详见PyTorch 网站): conda install pytorch t ...

  5. JVM-总结列表

    第一章 JVM内存结构 1.为什么要了解JVM内存管理机制 JVM自动的管理内存的分配与回收,这会在不知不觉中浪费很多内存,导致JVM花费很多时间去进行垃圾回收(GC) 内存泄露,导致JVM内存最终不 ...

  6. ElasticSearch架构及详解

    1. 图解es内部机制 1.1. 图解es分布式基础 1.1.1es对复杂分布式机制的透明隐藏特性 分布式机制:分布式数据存储及共享. 分片机制:数据存储到哪个分片,副本数据写入. 集群发现机制:cl ...

  7. biancheng-NumPy教程

    目录http://c.biancheng.net/numpy/ 1NumPy是什么2NumPy下载与安装3NumPy ndarray对象4NumPy数据类型5NumPy数组属性6Numpy创建数组7N ...

  8. 如何在 ASP.NET Core 中实现速率限制?

    在 ASP.NET Core 中实现速率限制(Rate Limiting)中间件可以帮助你控制客户端对 API 的请求频率,防止滥用和过载.速率限制通常用于保护服务器资源,确保服务的稳定性和可用性. ...

  9. RestClient 通过拦截器实现请求加密

    今天我发现了一个关于请求加密的有效写法,特此分享给大家.如果你的加密需求是将请求参数也包含在内,通常情况下,我们需要先将请求体转换成 JSON 格式或其他对象类型,再使用字符串的形式进行加密操作.以下 ...

  10. Iceberg治理服务Amoro---配置Prometheus + Grafana看板

    一.基础资料 1.mac安装Prometheus + Grafana https://www.cnblogs.com/robots2/p/18689540 2.配置文档 https://amoro.a ...