JAVA中的红黑树

程序你得看得懂 2024-02-22 19:48:52

红黑树(Red-Black Tree)是一种自平衡的二叉查找树,它在进行插入和删除操作时,通过特定的调整规则来保持树的平衡,从而在大多数情况下实现接近O(log n)的查找、插入和删除操作。

应用场景

红黑树常用于需要高效查找、插入和删除操作的数据结构和算法中,例如:

Java中的TreeMap和TreeSet:Java标准库中的TreeMap和TreeSet类就是基于红黑树实现的,它们提供了高效的键值对存储和元素集合存储。内存数据库索引:一些内存数据库系统使用红黑树作为索引结构,以提高数据检索速度。文件系统:某些文件系统使用红黑树来管理目录结构,以便快速查找和遍历。网络路由表:在网络路由算法中,红黑树可用于维护动态路由表。编译器中的符号表:编译器在处理源代码时,可以使用红黑树来管理符号表,以便快速查找变量和函数声明。示例代码enum Color { RED, BLACK } Node { int data; Color color; Node left, right, parent; Node(int data) { this.data = data; color = Color.RED; left = right = parent = null; } } RedBlackTree { private Node root; // 插入、删除、查找等方法将在这里实现 // ... // 辅助方法,用于左旋 private void leftRotate(Node x) { Node y = x.right; x.right = y.left; if (y.left != null) { y.left.parent = x; } y.parent = x.parent; if (x.parent == null) { root = y; } else if (x == x.parent.left) { x.parent.left = y; } else { x.parent.right = y; } y.left = x; x.parent = y; } // 辅助方法,用于右旋 private void rightRotate(Node y) { Node x = y.left; y.left = x.right; if (x.right != null) { x.right.parent = y; } x.parent = y.parent; if (y.parent == null) { root = x; } else if (y == y.parent.left) { y.parent.left = x; } else { y.parent.right = x; } x.right = y; y.parent = x; } // 插入后的修复操作 private void fixInsertion(Node k) { while (k.parent != null && k.parent.color == Color.RED) { if (k.parent == k.parent.parent.left) { Node uncle = k.parent.parent.right; if (uncle != null && uncle.color == Color.RED) { k.parent.color = Color.BLACK; uncle.color = Color.BLACK; k.parent.parent.color = Color.RED; k = k.parent.parent; } else { if (k == k.parent.right) { k = k.parent; leftRotate(k); } k.parent.color = Color.BLACK; k.parent.parent.color = Color.RED; rightRotate(k.parent.parent); } } else { // 与上面类似,但方向相反 // ... } } root.color = Color.BLACK; } public void insert(int data) { Node z = new Node(data); if (root == null) { root = z; root.color = Color.BLACK; return; } Node y = null; Node x = root; while (x != null) { y = x; if (z.data < x.data) { x = x.left; } else { x = x.right; } } z.parent = y; if (z.data < y.data) { y.left = z; } else { y.right = z; } fixInsertion(z); } // 删除和其他方法将在这里实现 // ... }

上面的代码实现了一个简化的红黑树,包括节点插入后的修复操作。为了完整性,你还需要实现删除操作、查找操作以及其他辅助方法。这个示例主要是为了展示红黑树的基本结构和插入操作中的修复过程。

0 阅读:14

程序你得看得懂

简介:感谢大家的关注