Skip to content

Commit b38ffc6

Browse files
committed
Added splay trees
1 parent 5d37655 commit b38ffc6

1 file changed

Lines changed: 37 additions & 38 deletions

File tree

data_structures/binary_tree/splay_tree.py renamed to data_structures/binary_tree/splay_trees.py

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
class SplayNode:
1616
"""Node class for Splay Tree"""
17-
17+
1818
def __init__(self, data: Any) -> None:
1919
self.data = data
2020
self.left: SplayNode | None = None
@@ -24,7 +24,7 @@ def __init__(self, data: Any) -> None:
2424
class SplayTree:
2525
"""
2626
Splay Tree implementation with basic operations
27-
27+
2828
>>> tree = SplayTree()
2929
>>> tree.insert(10)
3030
>>> tree.insert(5)
@@ -39,10 +39,10 @@ class SplayTree:
3939
>>> list(tree.inorder())
4040
[10, 15]
4141
"""
42-
42+
4343
def __init__(self) -> None:
4444
self.root: SplayNode | None = None
45-
45+
4646
def _right_rotate(self, node: SplayNode) -> SplayNode:
4747
"""Right rotation for splay operation"""
4848
left_child = node.left
@@ -51,7 +51,7 @@ def _right_rotate(self, node: SplayNode) -> SplayNode:
5151
node.left = left_child.right
5252
left_child.right = node
5353
return left_child
54-
54+
5555
def _left_rotate(self, node: SplayNode) -> SplayNode:
5656
"""Left rotation for splay operation"""
5757
right_child = node.right
@@ -60,54 +60,54 @@ def _left_rotate(self, node: SplayNode) -> SplayNode:
6060
node.right = right_child.left
6161
right_child.left = node
6262
return right_child
63-
63+
6464
def _splay(self, root: SplayNode | None, key: Any) -> SplayNode | None:
6565
"""
6666
Splay operation to move accessed node to root
6767
"""
6868
if root is None or root.data == key:
6969
return root
70-
70+
7171
# Key is in left subtree
7272
if key < root.data:
7373
if root.left is None:
7474
return root
75-
75+
7676
# Zig-Zig (Left Left)
7777
if key < root.left.data:
7878
root.left.left = self._splay(root.left.left, key)
7979
root = self._right_rotate(root)
80-
80+
8181
# Zig-Zag (Left Right)
8282
elif key > root.left.data:
8383
root.left.right = self._splay(root.left.right, key)
8484
if root.left.right:
8585
root.left = self._left_rotate(root.left)
86-
86+
8787
return self._right_rotate(root) if root.left else root
88-
88+
8989
# Key is in right subtree
9090
else:
9191
if root.right is None:
9292
return root
93-
93+
9494
# Zag-Zag (Right Right)
9595
if key > root.right.data:
9696
root.right.right = self._splay(root.right.right, key)
9797
root = self._left_rotate(root)
98-
98+
9999
# Zag-Zig (Right Left)
100100
elif key < root.right.data:
101101
root.right.left = self._splay(root.right.left, key)
102102
if root.right.left:
103103
root.right = self._right_rotate(root.right)
104-
104+
105105
return self._left_rotate(root) if root.right else root
106-
106+
107107
def insert(self, key: Any) -> None:
108108
"""
109109
Insert a key into the splay tree
110-
110+
111111
>>> tree = SplayTree()
112112
>>> tree.insert(10)
113113
>>> tree.root.data
@@ -116,14 +116,14 @@ def insert(self, key: Any) -> None:
116116
if self.root is None:
117117
self.root = SplayNode(key)
118118
return
119-
119+
120120
self.root = self._splay(self.root, key)
121-
121+
122122
if self.root.data == key:
123123
return # Key already exists
124-
124+
125125
new_node = SplayNode(key)
126-
126+
127127
if key < self.root.data:
128128
new_node.right = self.root
129129
new_node.left = self.root.left
@@ -132,13 +132,13 @@ def insert(self, key: Any) -> None:
132132
new_node.left = self.root
133133
new_node.right = self.root.right
134134
self.root.right = None
135-
135+
136136
self.root = new_node
137-
137+
138138
def search(self, key: Any) -> bool:
139139
"""
140140
Search for a key in the splay tree
141-
141+
142142
>>> tree = SplayTree()
143143
>>> tree.insert(10)
144144
>>> tree.search(10)
@@ -148,14 +148,14 @@ def search(self, key: Any) -> bool:
148148
"""
149149
if self.root is None:
150150
return False
151-
151+
152152
self.root = self._splay(self.root, key)
153153
return self.root.data == key
154-
154+
155155
def delete(self, key: Any) -> None:
156156
"""
157157
Delete a key from the splay tree
158-
158+
159159
>>> tree = SplayTree()
160160
>>> tree.insert(10)
161161
>>> tree.insert(5)
@@ -165,12 +165,12 @@ def delete(self, key: Any) -> None:
165165
"""
166166
if self.root is None:
167167
return
168-
168+
169169
self.root = self._splay(self.root, key)
170-
170+
171171
if self.root.data != key:
172172
return # Key not found
173-
173+
174174
if self.root.left is None:
175175
self.root = self.root.right
176176
elif self.root.right is None:
@@ -179,11 +179,11 @@ def delete(self, key: Any) -> None:
179179
temp = self.root
180180
self.root = self._splay(self.root.left, key)
181181
self.root.right = temp.right
182-
182+
183183
def inorder(self) -> Iterator[Any]:
184184
"""
185185
Inorder traversal of the splay tree
186-
186+
187187
>>> tree = SplayTree()
188188
>>> tree.insert(10)
189189
>>> tree.insert(5)
@@ -192,7 +192,7 @@ def inorder(self) -> Iterator[Any]:
192192
[5, 10, 15]
193193
"""
194194
yield from self._inorder_helper(self.root)
195-
195+
196196
def _inorder_helper(self, node: SplayNode | None) -> Iterator[Any]:
197197
"""Helper method for inorder traversal"""
198198
if node:
@@ -203,21 +203,20 @@ def _inorder_helper(self, node: SplayNode | None) -> Iterator[Any]:
203203

204204
if __name__ == "__main__":
205205
import doctest
206-
207206
doctest.testmod()
208-
207+
209208
# Example usage
210209
tree = SplayTree()
211210
elements = [10, 5, 15, 3, 7, 12, 18]
212-
211+
213212
print("Inserting elements:", elements)
214213
for elem in elements:
215214
tree.insert(elem)
216-
215+
217216
print("Inorder traversal:", list(tree.inorder()))
218-
217+
219218
print("Searching for 7:", tree.search(7))
220219
print("Searching for 20:", tree.search(20))
221-
220+
222221
tree.delete(5)
223222
print("After deleting 5:", list(tree.inorder()))

0 commit comments

Comments
 (0)