红黑树的结构和优势

首先看一下红黑树的结构:

在这里插入图片描述
红黑树的结构特点:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

为什么要要用红黑树?
1、首先红黑树是不符合AVL树的平衡条件的,即每个节点的左子树和右子树的高度最多差1的二叉查找树。但是提出了为节点增加颜色,红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高

2、红黑树能够以O(log2 (n)) 的时间复杂度进行搜索、插入、删除操作

3、简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。

红黑树和平衡树的对比和选择
1、平衡树结构更加直观,读取性能比红黑树要高;增加和删除节点 恢复平衡的性能不如红黑树
2、红黑树,读取性能不如平衡树;增加和删除节点 恢复平衡性能比平衡树好

红黑树的使用场景:
TreeMap、TreeSet以及JDK1.8之后的HashMap底层都用到了红黑树。

红黑树(Red-Black Tree)是一种自平衡的二叉查找树,广泛用于Java集合框架中(如`TreeMap``TreeSet`)。它通过一定的规则来保证树的高度接近对数级别,从而确保基本操作(插入、删除、查找)的时间复杂度为 O(log n)。 --- ### ✅ **红黑树优势** 1. **自平衡性**: - 红黑树在每次插入或删除节点后都会进行颜色翻转旋转操作,以保持树的近似平衡。 - 保证最坏情况下的查找、插入、删除时间复杂度为 O(log n),适合处理大规模数据。 2. **高效的动态操作**: - 插入删除操作的再平衡次数较少,通常最多只需要两次旋转即可完成,性能优于 AVL 树。 3. **广泛的应用场景**: - Java 中的 `TreeMap`、`TreeSet` 部分版本的 `HashMap` 在链表过长时使用红黑树优化性能。 - 操作系统中用于调度器管理进程优先级等场景。 4. **实现相对简单**: - 相比于其他平衡树结构(如 AVL 树),红黑树的插入删除逻辑虽然较复杂,但其再平衡操作更高效且实现难度适中。 --- ### ❌ **红黑树的劣势** 1. **实现复杂**: - 需要维护颜色属性以及一系列复杂的旋转变色规则,调试实现较为困难。 - 对初学者来说理解成本高。 2. **查找效率略逊于 AVL 树**: - 虽然红黑树的查找也是 O(log n),但由于其树的高度可能略高于 AVL 树,因此查找速度稍慢。 3. **不适合静态数据**: - 如果数据基本不变,使用红黑树反而会因为额外的颜色标记旋转操作带来不必要的开销。 4. **空间占用略大**: - 每个节点需要多出一个 bit 来存储颜色信息(红色或黑色),在内存敏感的环境中可能会有影响。 --- ### 🧪 示例代码:Java 中使用红黑树(通过 TreeMap) ```java import java.util.TreeMap; public class RedBlackTreeExample { public static void main(String[] args) { TreeMap<Integer, String> treeMap = new TreeMap<>(); // 插入键值对 treeMap.put(5, "Five"); treeMap.put(2, "Two"); treeMap.put(8, "Eight"); treeMap.put(1, "One"); // 查找元素 System.out.println("Key 5: " + treeMap.get(5)); // 输出 Five // 遍历输出 for (Integer key : treeMap.keySet()) { System.out.println(key + " -> " + treeMap.get(key)); } // 删除元素 treeMap.remove(2); System.out.println("After removing key 2: " + treeMap); } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值