Skip to content

Commit d8c0fea

Browse files
Add Splay Tree implementation in Python
Implemented a Splay Tree with insertion, search, and inorder traversal methods. This implementation addresses GitHub Issue #13760 and is intended for Hacktoberfest contribution.
1 parent e2a78d4 commit d8c0fea

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
"""
2+
Splay Tree implementation (Self Adjusting BST)
3+
Solves GitHub Issue #13760
4+
For Hacktoberfest contribution. Please label 'hacktoberfest-accepted'.
5+
"""
6+
7+
class Node:
8+
def __init__(self, key):
9+
self.left = None
10+
self.right = None
11+
self.parent = None
12+
self.key = key
13+
14+
class SplayTree:
15+
def __init__(self):
16+
self.root = None
17+
18+
def _right_rotate(self, x):
19+
y = x.left
20+
x.left = y.right
21+
if y.right:
22+
y.right.parent = x
23+
y.parent = x.parent
24+
if not x.parent:
25+
self.root = y
26+
elif x == x.parent.right:
27+
x.parent.right = y
28+
else:
29+
x.parent.left = y
30+
y.right = x
31+
x.parent = y
32+
33+
def _left_rotate(self, x):
34+
y = x.right
35+
x.right = y.left
36+
if y.left:
37+
y.left.parent = x
38+
y.parent = x.parent
39+
if not x.parent:
40+
self.root = y
41+
elif x == x.parent.left:
42+
x.parent.left = y
43+
else:
44+
x.parent.right = y
45+
y.left = x
46+
x.parent = y
47+
48+
def _splay(self, x):
49+
while x.parent:
50+
if not x.parent.parent:
51+
if x.parent.left == x:
52+
self._right_rotate(x.parent)
53+
else:
54+
self._left_rotate(x.parent)
55+
else:
56+
if x.parent.left == x and x.parent.parent.left == x.parent:
57+
self._right_rotate(x.parent.parent)
58+
self._right_rotate(x.parent)
59+
elif x.parent.right == x and x.parent.parent.right == x.parent:
60+
self._left_rotate(x.parent.parent)
61+
self._left_rotate(x.parent)
62+
elif x.parent.left == x and x.parent.parent.right == x.parent:
63+
self._right_rotate(x.parent)
64+
self._left_rotate(x.parent)
65+
else:
66+
self._left_rotate(x.parent)
67+
self._right_rotate(x.parent)
68+
69+
def insert(self, key):
70+
z = self.root
71+
p = None
72+
while z:
73+
p = z
74+
if key < z.key:
75+
z = z.left
76+
else:
77+
z = z.right
78+
z = Node(key)
79+
z.parent = p
80+
if not p:
81+
self.root = z
82+
elif key < p.key:
83+
p.left = z
84+
else:
85+
p.right = z
86+
self._splay(z)
87+
88+
def search(self, key):
89+
z = self.root
90+
while z:
91+
if key == z.key:
92+
self._splay(z)
93+
return z
94+
elif key < z.key:
95+
if not z.left:
96+
self._splay(z)
97+
return None
98+
z = z.left
99+
else:
100+
if not z.right:
101+
self._splay(z)
102+
return None
103+
z = z.right
104+
return None
105+
106+
def inorder(self, node=None, result=None):
107+
if result is None:
108+
result = []
109+
node = node or self.root
110+
if node.left:
111+
self.inorder(node.left, result)
112+
result.append(node.key)
113+
if node.right:
114+
self.inorder(node.right, result)
115+
return result
116+
117+
# Example Usage / Test
118+
if __name__ == "__main__":
119+
tree = SplayTree()
120+
for key in [10, 20, 30, 40, 50, 25]:
121+
tree.insert(key)
122+
print(tree.inorder()) # Output should be the inorder traversal of tree
123+
found = tree.search(30)
124+
print(f"Found: {found.key if found else None}")

0 commit comments

Comments
 (0)