2-3 树/红黑树(red-black tree)
2-3 tree
![](https://i.imgur.com/oKdeq5j.jpg)
红黑树
红黑树可以理解为实现了2-3树的BST(binary search tree),它是一个自平衡树,保证在最坏的情况下的操作也是O(lg(n))
特性:
- 每个节点有一个颜色属性(红或黑)
- 根节点是黑色的
- 所有的null节点都是黑色的,从任何null节点到根节点所经过的黑色节点数目相同
查找操作与BST是相同的
插入规则如下:
- 按BST的插入方法在null节点上建立新节点,新节点的颜色为红色
- 如果有右子节点为红色,则左旋,右子节点变为父节点
- 如果左子节点与左孙节点都为红色,则进行右旋,左字节的变为父节点
- 如果两个节点的颜色都为红色,则翻转反色
操作流程如下图所示:
![](https://i.imgur.com/QqrUI06.jpg)
- 图左为插入节点c,先标记为红,因为a、c都为红节点,故颜色反转
- 中间插入节点a,由于插入后a、b节点都为红色,按第3条规则需要进行右旋操作,b变成了新的父节点
- 图右插入节点b,由于b在a的右边,故先进行左旋,然后又发现a、b同为红色,再进行右旋
左旋:
左图为左旋前,右图为左旋后,代码如下所示:
private Node rotateRight(Node h){
assert isRed(h.right);
Node x = h.right; // 复制h的 右子树 为节点x
h.right = x.left; // 将x的左子树移动到h的右节点上(替代)
x.left = h; // 将修改后的h节点作为x的左节点(替代)
x.color = h.color; // x继承h的颜色
h.color = RED; // 将h节点的颜色设置为红色
return x; // 返回x节点作为新的父节点
}
右旋操作与之类似
颜色反转:
左图为颜色翻转前,右图为操作之后,代码如下所示:
private void flipColors(Node h){
assert !isRed(h);
assert isRed(h.left);
assert isRed(h.right);
h.color = RED; // 将父节点颜色改为红色
h.left.color = BLACK; // 将左右子节点颜色改为黑色,
h.right.color = BLACK;
}
此处只实现了查找与插入,如要完整实现所有功能(还有删除),可以采用左倾红黑树(LLRB, Left-leaning red–black tree)
红黑树显示的demo
Reference
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!