1414
1515class 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:
2424class 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
204204if __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