A Red-Black Tree is a self-balancing binary search tree that maintains balance by ensuring specific properties. It provides efficient search, insertion, and deletion operations in O(log n) time.
Properties of a Red-Black Tree
A Red-Black Tree follows these key properties:
- Each node is either red or black.
- The root node is always black.
- All leaves (NIL nodes) are black.
- If a node is red, its children must be black (no two consecutive red nodes).
- Every path from a node to its descendant NIL nodes must have the same number of black nodes.
Implementing a Red-Black Tree in Python
Node Structure
Each node stores a value, left and right child pointers, a color, and a parent pointer.
class Node: def __init__(self, data): self.data = data self.color = "red" # New nodes are red by default self.left = None self.right = None self.parent = None
Red-Black Tree Class
class RedBlackTree: def __init__(self): self.NIL = Node(0) # Sentinel NIL node self.NIL.color = "black" self.root = self.NIL
Insertion Operation
def insert(self, key): new_node = Node(key) new_node.left = self.NIL new_node.right = self.NIL y = None x = self.root while x != self.NIL: y = x if new_node.data < x.data: x = x.left else: x = x.right new_node.parent = y if y is None: self.root = new_node elif new_node.data < y.data: y.left = new_node else: y.right = new_node new_node.color = "red" self.fix_insert(new_node)
Left Rotation
def left_rotate(self, x): y = x.right x.right = y.left if y.left != self.NIL: y.left.parent = x y.parent = x.parent if x.parent is None: self.root = y elif x == x.parent.left: x.parent.left = y else: x.parent.right = y y.left = x x.parent = y
Right Rotation
def right_rotate(self, x): y = x.left x.left = y.right if y.right != self.NIL: y.right.parent = x y.parent = x.parent if x.parent is None: self.root = y elif x == x.parent.right: x.parent.right = y else: x.parent.left = y y.right = x x.parent = y
Conclusion
The Red-Black Tree provides efficient insertion, deletion, and search operations while ensuring balance. Understanding its rotations and color adjustments is key to implementing it effectively. With this implementation, you can use Red-Black Trees in applications that require balanced search structures, such as databases and memory management systems.