• [数据结构


    一、简介

    也是一种平衡二叉树,但每个节点有一个存储位表示节点的颜色,可以是红或黑。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL 树的高度 <= 红黑树),相对于要求严格的 AVL 树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,用红黑树。


    二、性质

    如下图所示,每个节点非红即黑:

    • 每个节点非红即黑;
    • 根节点是黑的,每个叶节点(叶节点即树尾端 NULL 指针或 NULL 节点)都是黑的;
    • 如果一个节点是红的,那么它的两个孩子都是黑的;
    • 对于任意节点而言,其到叶子点树 NULL 指针的每条路径都包含相同数目的黑节点;
    • 每条路径都包含相同的黑节点。

    三、应用

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

    四、红黑树和 AVL 树的区别

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

    平衡二叉树类型 平衡度 调整频率 适用场景
    AVL树 查询多,增/删少
    红黑树 增/删频繁

  • 相关阅读:
    hdu 4963(中途相遇法)
    UVALive 6869(后缀数组)
    AC自动机小结
    poj 2409+2154+2888(Burnside定理)
    HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)
    bunoj 34990(hash)
    CSU 1506(最小费用最大流)
    CF 514C(hash)
    lightoj 1297(三分)
    lightoj 1179(线段树)
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11563809.html
Copyright © 2020-2023  润新知