[数据结构 - 第6章补充] 树之红黑树的概念
一、简介
也是一种平衡二叉树,但每个节点有一个存储位表示节点的颜色,可以是红或黑。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL 树的高度 <= 红黑树),相对于要求严格的 AVL 树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,用红黑树。
二、性质
如下图所示,每个节点非红即黑:
- 每个节点非红即黑;
- 根节点是黑的,每个叶节点(叶节点即树尾端 NULL 指针或 NULL 节点)都是黑的;
- 如果一个节点是红的,那么它的两个孩子都是黑的;
- 对于任意节点而言,其到叶子点树 NULL 指针的每条路径都包含相同数目的黑节点;
- 每条路径都包含相同的黑节点。
三、应用
- 广泛用于 C++ 的 STL 中,set 和 map 是用红黑树实现的;
- Linux 的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;
- IO 多路复用的 epoll 采用红黑树组织管理 sockfd,以支持快速的增删改查;
- Nginx 中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;
- Java 的 TreeMap 的实现;。
四、红黑树和 AVL 树的区别
红黑树和 AVL 树都是平衡二叉树,虽然 AVL 树是最早发明的平衡二叉树,但直接把平衡二叉树等价于 AVL 树,我认为非常不合适,但很多地方都在这么用。两者的比较如下:
平衡二叉树类型 | 平衡度 | 调整频率 | 适用场景 |
---|---|---|---|
AVL树 | 高 | 高 | 查询多,增/删少 |
红黑树 | 低 | 低 | 增/删频繁 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!