[数据结构 - 第6章补充] 树之红黑树的概念

一、简介

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


二、性质

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

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

三、应用

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

四、红黑树和 AVL 树的区别

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

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

posted @ 2019-09-21 17:24  fengMisaka  阅读(557)  评论(0编辑  收藏  举报