
红黑树——Java
每个节点的颜色只能是红色或黑色。 根节点必须是黑色。 如果一个节点是红色,那么它的左右子节点必须是黑色。 在任何一条从根到叶子的路径上,黑色节点的数量是固定的。 每个叶子节点(空节点)必须是黑色。 按照二叉搜索树的规则插入新节点。 检查并调整树的颜色,以确保红黑树的性质不被破坏。 插入节点为根节点:根节点必须是黑色,直接设置即可。 插入节点的父节点是黑色:无需额外调整。 插入节点的父节点是红色:需要进一步调整,具体分为以下两种情况:
发布日期:2021-05-08 06:40:20
浏览次数:25
分类:精选文章
本文共 2340 字,大约阅读时间需要 7 分钟。
红黑树(Red-Black Tree)是一种高效的平衡二叉搜索树,它通过在每个节点上记录颜色信息(Red或Black)来保证树的平衡性。与AVL树和其他平衡树不同,红黑树的平衡性是相对的,而不是绝对的。红黑树的主要特点是:最长路径的长度不会超过最短路径的两倍,这使得它在实际应用中表现优异。
红黑树的性质
这些性质保证了红黑树在插入、删除和查找操作时的平衡性。
红黑树的查找
红黑树的查找过程与普通二叉搜索树相同。由于红黑树的平衡性保证,查找的平均时间复杂度是O(log N)。
红黑树的插入
红黑树的插入过程分为两个主要步骤:
插入过程分为以下几种情况:
- 父节点有红色兄弟:将父节点和红色兄弟节点改为黑色,同时将祖父节点改为红色,并继续调整。
- 父节点没有红色兄弟:如果是右旋或左旋,需要对父节点进行旋转调整。
AVL树与红黑树的比较
红黑树和AVL树都是高效的平衡二叉搜索树,但它们的实现方式和平衡机制有所不同:
- 红黑树的插入和旋转次数较少,实现简单且性能优异。
- AVL树的查找性能略优,但插入和删除操作的复杂度较高。
TreeMap的源码示例
TreeMap的实现通常基于红黑树。以下是红黑树插入和调整的一些关键代码片段:
public V put(K key, V value) { Entryt = root; if (t == null) { root = new Entry<>(key, value, null); size = 1; modCount++; return null; } int cmp; Comparator cpr = comparator; if (cpr != null) { while (t != null) { parent = t; cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } } else { Comparable k = (Comparable ) key; while (t != null) { parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } } Entry e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; else parent.right = e; fixAfterInsertion(e); size++; modCount++; return null;}private void fixAfterInsertion(Entry x) { x.color = RED; while (x != null && x != root && x.parent.color == RED) { Entry p = x.parent; Entry pp = p.parent; boolean isLeftChild = (p == p.left); Entry y = isLeftChild ? p.right : p.left; if (y != null && y.color == RED) { p.color = BLACK; y.color = BLACK; pp.color = RED; x = pp; } else { if (isLeftChild) { x = p; rotateLeft(p); } else { x = p; rotateRight(p); } p.color = BLACK; pp.color = RED; } } root.color = BLACK; }
总结
红黑树通过简单的颜色规则和插入调整机制,实现了高效的平衡二叉搜索树。它在实际应用中的表现优于AVL树,且实现复杂度较低,因此在Java的标准库(如TreeMap和TreeSet)中被广泛使用。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月26日 02时52分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
VHDL代码风格
2019-03-05
图像处理系列1.skimage
2019-03-05
Object Clone
2019-03-05
Javascript中String支持使用正则表达式的四种方法
2019-03-05
2021年判断浏览器最新写法,你都掌握了吗?
2019-03-05
【IoT】蓝牙BLE基础:CC254x通信系列之模拟SPI协议
2019-03-05
【IoT】TI BLE CC2541 串口控制蓝牙详解
2019-03-05
【产品】项目管理的五个过程和九大知识领域之二
2019-03-05
【项目管理】项目管理流程浅析
2019-03-05
【Tool】如何使用 Uniflash 烧写 WIFI 芯片 CC3200
2019-03-05
copy_{to, from}_user()的思考
2019-03-05
Web前端安全策略之CSRF的攻击与防御
2019-03-05
纯客户端页面关键字搜索高亮jQuery插件
2019-03-05
linux运维中常用的命令
2019-03-05
M1芯片的macbook安装王者荣耀,原神,崩坏方法
2019-03-05
Java温故而知新-反射机制
2019-03-05
eclipse引用sun.misc开头的类
2019-03-05
firefox中angular2嵌套发送请求问题
2019-03-05
【mybatis3】调试/断点打印日志
2019-03-05
C++
2019-03-05