diff --git a/content/posts/2024-07-27-treap-revisited/index.md b/content/posts/2024-07-27-treap-revisited/index.md index 05a4b0c..3a4d3e6 100644 --- a/content/posts/2024-07-27-treap-revisited/index.md +++ b/content/posts/2024-07-27-treap-revisited/index.md @@ -36,3 +36,38 @@ operations: `split` and `merge`. We'll be reusing the same structures as in the last post, so let's skip straight to implementing those fundaments, and building on them for `insert` and `delete`. + +### Split + +Splitting a tree means taking a key, and getting the following output: + +* a `left` node, root of the tree of all keys lower than the input. +* an extracted `node` which corresponds to the input `key`. +* a `right` node, root of the tree of all keys higher than the input. + +```python +type OptionalNode[K, V] = Node[K, V] | None + +def split( + root: OptionalNode[K, V], + key: K, +) -> tuple[OptionalNode[K, V], OptionalNode[K, V], OptionalNode[K, V]]: + # Base case, empty tree + if root is None: + return None, None, None + # If we found the key, simply extract left and right + if root.key == key: + left, right = root.left, root.right + root.left, root.right = None, None + return left, root, right + # Otherwise, recurse on the corresponding side of the tree + if root.key < key: + left, node, right = split(root.right, key) + root.right = left + return root, node, right + if key < root.key: + left, node, right = split(root.left, key) + root.left = right + return left, node, root + raise RuntimeError("Unreachable") +```