posts: treap-revisited: add split

This commit is contained in:
Bruno BELANYI 2024-07-27 18:32:09 +01:00
parent 021c40f6ac
commit d89ea56edd

View file

@ -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")
```