一、简介
也是一种平衡二叉树,但每个节点有一个存储位表示节点的颜色,可以是红或黑。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL 树的高度 <= 红黑树),相对于要求严格的 AVL 树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,用红黑树。
二、性质
如下图所示,每个节点非红即黑:
- 每个节点非红即黑;
- 根节点是黑的,每个叶节点(叶节点即树尾端 NULL 指针或 NULL 节点)都是黑的;
- 如果一个节点是红的,那么它的两个孩子都是黑的;
- 对于任意节点而言,其到叶子点树 NULL 指针的每条路径都包含相同数目的黑节点;
- 每条路径都包含相同的黑节点。
三、应用
- 广泛用于 C++ 的 STL 中,set 和 map 是用红黑树实现的;
- Linux 的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;
- IO 多路复用的 epoll 采用红黑树组织管理 sockfd,以支持快速的增删改查;
- Nginx 中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;
- Java 的 TreeMap 的实现;。
四、红黑树和 AVL 树的区别
红黑树和 AVL 树都是平衡二叉树,虽然 AVL 树是最早发明的平衡二叉树,但直接把平衡二叉树等价于 AVL 树,我认为非常不合适,但很多地方都在这么用。两者的比较如下:
平衡二叉树类型 | 平衡度 | 调整频率 | 适用场景 |
---|---|---|---|
AVL树 | 高 | 高 | 查询多,增/删少 |
红黑树 | 低 | 低 | 增/删频繁 |