Skip to content

Commit b8cd089

Browse files
committed
Added treap
1 parent 56513cb commit b8cd089

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

data_structures/binary tree/treap.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from random import random
2+
from typing import Tuple
3+
4+
5+
class Node:
6+
def __init__(self, key: int):
7+
self.key = key
8+
self.prior = random()
9+
self.l = None
10+
self.r = None
11+
12+
13+
def split(root: Node, key: int) -> Tuple[Node, Node]:
14+
if root is None:
15+
return (None, None)
16+
if root.key >= key:
17+
l, root.l = split(root.l, key)
18+
return (l, root)
19+
else:
20+
root.r, r = split(root.r, key)
21+
return (root, r)
22+
23+
24+
def merge(left: Node, right: Node) -> Node:
25+
if (not left) or (not right):
26+
return left or right
27+
if left.key > right.key:
28+
left.r = merge(left.r, right)
29+
return left
30+
else:
31+
right.l = merge(left, right.l)
32+
return right
33+
34+
35+
def insert(root: Node, key: int) -> Node:
36+
node = Node(key)
37+
l, r = split(root, key)
38+
root = merge(l, node)
39+
root = merge(root, r)
40+
return root
41+
42+
43+
def erase(root: Node, key: int) -> Node:
44+
l, r = split(root, key)
45+
_, r = split(r, key + 1)
46+
return merge(l, r)
47+
48+
49+
def node_print(root: Node):
50+
if not root:
51+
return
52+
node_print(root.l)
53+
print(root.key, end=" ")
54+
node_print(root.r)
55+
56+
57+
def interactTreap():
58+
root = None
59+
while True:
60+
cmd = input().split()
61+
cmd[1] = int(cmd[1])
62+
if cmd[0] == "+":
63+
root = insert(root, cmd[1])
64+
elif cmd[0] == "-":
65+
root = erase(root, cmd[1])
66+
else:
67+
print("Unknown command")
68+
node_print(root)
69+
70+
71+
if __name__ == "__main__":
72+
interactTreap()

0 commit comments

Comments
 (0)