在此之前,我没有了解过红黑树以及AVL tree,真是孤陋寡闻。如果你也在学习的话,我们一起进步。

如果,你很急,那么只看红色加粗即可。


1.红黑树(RB-tree)

红黑树是一种特殊的二叉搜索树,特殊在它的性质。它是SGI STL(gcc编译器使用)唯一实现的搜寻树,作为关联式容器(至少有set, map, multiset)的底部机制之用。

性质:

  • 节点非黑即红。
  • 根节点是黑色。
  • 树尾端NULL节点,是黑色。
  • 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
===》从根到叶子的最长的可能路径不多于最短的可能路径的两倍长
(新增节点必须为红,新增节点父节点必须为黑)
 
为什么呢?
注意到性质4导致了路径不能有两个毗连的红色节点。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。===》此树大致上平衡的。
 
它适合什么?
查找 插入 删除 较多的情况(搜寻效率几乎和AVL-tree树相等)
 
RB-tree节点结构
 struct __rb_tree_node_base
{
color_type color;//节点颜色
base_ptr parent;//父节点
base_ptr left;//左节点
base_ptr right;//右节点
...
}

2.AVL 树(平衡二叉搜索树)

平衡二叉树要求很严格,它限定左右子树的高度差(绝对值)不超过1,所以他的高度会低于红黑树,我们知道,二叉树的查找复杂度与其高度密切相关(O(log2n)),所以我们就知道了:二叉平衡树适合查找。碍于它的严格限制,必须要时刻保证左右子树高度差,所以在进行插入删除操作时,旋转子树(但旋转、双旋转)就变得很麻烦。
 
它适合什么?
查找 较多的情况
 
其实作为二叉搜索树的AVL和RB-tree,查找速度相当O(logn),在插入和删除上,都要进行旋转,红黑树还要进行红黑变色,统计性能红黑树要优于AVL,这也是GUN C++ 的SGI STL采用RB-tree作为map、set底层实现的主要原因。

上面说的太浅,我的另一篇较为详细梳理红黑树STL源码的文章 https://www.cnblogs.com/yocichen/p/10913883.html,希望对你有帮助。

红黑树和AVL树的更多相关文章

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

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

  2. 红黑树与AVL树

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

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

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

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

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

  5. 红黑树和AVL树的区别(转)

    add by zhj: AVL树和红黑树都是平衡二叉树,虽然AVL树是最早发明的平衡二叉树,但直接把平衡二叉树等价于AVL树,我认为非常不合适. 但很多地方都在这么用.两者的比较如下 平衡二叉树类型 ...

  6. 转:红黑树和AVL树(平衡二叉树)区别

    本文转载至链接:https://blog.csdn.net/u010899985/article/details/80981053 一.AVL树(平衡二叉树) (1)简介 AVL树是带有平衡条件的二叉 ...

  7. B树、B+树、红黑树、AVL树比较

    B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树. B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计. B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由 ...

  8. 红黑树与AVL树比较

    链接地址:https://blog.csdn.net/zhangkunrun/article/details/38336543 B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由于树的深 ...

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

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

随机推荐

  1. mongodb download

    https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl

  2. using代码性能影响?

    Q:using当作命名空间?A:对代码编译有影响,对代码执行无任何影响:https://www.cnblogs.com/Interkey/p/UsingNameSpace.html Q:using用来 ...

  3. SpringBoot: 10.整合mybatis(转)

    需求:通过使用 SpringBoot+SpringMVC+MyBatis 整合实现一个对数据库中的 t_user 表的 CRUD 的操作 1.创建maven项目,添加项目所需依赖 <!--spr ...

  4. EuRoc V203数据集的坑

    EuRoc数据集时间戳问题 以前听别人说过V203序列有问题,今儿仔细看了才发现EuRoc的V203数据集中的左右相机 照片数量不相等,很僵硬,cam0存在大量丢帧,之前一直用单目数据,没什么感觉.. ...

  5. IndemindSDK数据采集程序

    目录 Indemind相机数据采集 Indemind相机数据采集 最近做一些实验需要自己采集一些数据玩玩,打算用之前买的indemind双目模组,实际用的时候感觉官方提供的采集程序不太好用,于是打算自 ...

  6. python使用socket向客户端发送数据的方法

    在使用locust测试长连接的时候,所有的请求全部faillure了,所以想到手动写一个连接脚本测试一下是否能连通 因为centos7自带python2.7所以用python写一个比较方便. #!/u ...

  7. flask数据库连接池DBUtils

    数据库连接池 为啥要使用数据库连接池 频繁的连接和断开数据库,消耗大,效率低 DBUtils可以创建多个线程连接数据库,且一直保持连接,不会断开 执行数据库操作时,由数据池分配线程,当数据池空时,可选 ...

  8. IDEA配置SpringBoot应用的profile启动参数

    参考博客:https://blog.csdn.net/li396864285/article/details/83576829 如图为, 配置多台eureka的启动参数, 分别为: --spring. ...

  9. 《剑指offer》递推与循环,栈和队列,回溯 (牛客10.27)

    难度 题目 知识点 07. 斐波那契数列 递推递归 - 两变量写法- 08. 跳台阶 同上 09. 变态跳台阶 dp 10. 矩形覆盖 同上 05. 用两个栈实现队列 模拟 ☆ 20. 包含min函数 ...

  10. VB6_小林的气象类模块

    前言. [如果使用过程有什么问题可以QQ或邮箱联系我. 1919988942  | w2638301509@gmail.com] ___________________________________ ...