Skip to content

Instantly share code, notes, and snippets.

@Rhernandez513
Created July 22, 2025 00:38
Show Gist options
  • Save Rhernandez513/dd0f72aa6e0798e848de3a51ae54cb7c to your computer and use it in GitHub Desktop.
Save Rhernandez513/dd0f72aa6e0798e848de3a51ae54cb7c to your computer and use it in GitHub Desktop.
rbtree.py
RED = True
BLACK = False
class Node:
def __init__(self, key, color=RED, left=None, right=None, parent=None):
self.key = key
self.color = color
self.left = left
self.right = right
self.parent = parent
class RedBlackTree:
def __init__(self):
self.NIL = Node(key=None, color=BLACK) # Sentinel NIL node
self.root = self.NIL
def insert(self, key):
new_node = Node(key, color=RED, left=self.NIL, right=self.NIL)
parent = None
current = self.root
while current != self.NIL:
parent = current
if new_node.key < current.key:
current = current.left
else:
current = current.right
new_node.parent = parent
if parent is None:
self.root = new_node
elif new_node.key < parent.key:
parent.left = new_node
else:
parent.right = new_node
self.fix_insert(new_node)
def fix_insert(self, node):
while node != self.root and node.parent.color == RED:
if node.parent == node.parent.parent.left:
uncle = node.parent.parent.right
if uncle.color == RED:
node.parent.color = BLACK
uncle.color = BLACK
node.parent.parent.color = RED
node = node.parent.parent
else:
if node == node.parent.right:
node = node.parent
self.left_rotate(node)
node.parent.color = BLACK
node.parent.parent.color = RED
self.right_rotate(node.parent.parent)
else:
uncle = node.parent.parent.left
if uncle.color == RED:
node.parent.color = BLACK
uncle.color = BLACK
node.parent.parent.color = RED
node = node.parent.parent
else:
if node == node.parent.left:
node = node.parent
self.right_rotate(node)
node.parent.color = BLACK
node.parent.parent.color = RED
self.left_rotate(node.parent.parent)
self.root.color = BLACK
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
def right_rotate(self, y):
x = y.left
y.left = x.right
if x.right != self.NIL:
x.right.parent = y
x.parent = y.parent
if y.parent is None:
self.root = x
elif y == y.parent.right:
y.parent.right = x
else:
y.parent.left = x
x.right = y
y.parent = x
def inorder(self, node=None):
if node is None:
node = self.root
if node != self.NIL:
self.inorder(node.left)
print(f"{node.key} ({'R' if node.color else 'B'})", end=' ')
self.inorder(node.right)
# Example usage:
if __name__ == "__main__":
rbt = RedBlackTree()
for val in [10, 20, 30, 15, 25, 5]:
rbt.insert(val)
rbt.inorder() # Should print keys in sorted order with color
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment