Created
July 22, 2025 00:38
-
-
Save Rhernandez513/dd0f72aa6e0798e848de3a51ae54cb7c to your computer and use it in GitHub Desktop.
rbtree.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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