posts: treap: add merge

This commit is contained in:
Bruno BELANYI 2024-07-27 18:32:28 +01:00
parent d33247b786
commit 0798812f86

View file

@ -73,3 +73,33 @@ def split(root: OptionalNode[K, V], key: K) -> SplitResult:
return SplitResult(left, node, root) return SplitResult(left, node, root)
raise RuntimeError("Unreachable") raise RuntimeError("Unreachable")
``` ```
### Merge
Merging a `left` and `right` tree means (cheaply) building a new tree containing
both of them. A pre-condition for merging is that the `left` tree is composed
entirely of nodes that are lower than any key in `right` (i.e: as in `left` and
`right` after a `split`).
```python
def merge(
left: OptionalNode[K, V],
right: OptionalNode[K, V],
) -> OptionalNode[K, V]:
# Base cases, left or right being empty
if left is None:
return right
if right is None:
return left
# Left has higher priority, it must become the root node
if left.priority >= right.priority:
# We recursively reconstruct its right sub-tree
left.right = merge(left.right, right)
return left
# Right has higher priority, it must become the root node
if left.priority < right.priority:
# We recursively reconstruct its left sub-tree
right.left = merge(left, right.left)
return right
raise RuntimeError("Unreachable")
```