Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions data_structures/binary_tree/splay_tree.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
#class node
class Node:
"""A node in the Splay Tree."""
def __init__(self, key, parent=None, left=None, right=None):
self.key = key # The value stored in the node
self.parent = parent # Pointer to the parent node
self.left = left # Pointer to the left child
self.right = right # Pointer to the right child


#Spary tree class
class SplayTree:
"""A self-adjusting Binary Search Tree."""
def __init__(self):
self.root = None # The root of the tree

# --- Basic Rotation Operations ---

Check failure on line 18 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:18:1: W293 Blank line contains whitespace
def _rotate_left(self, x):
"""Perform a left rotation around node x (moving x down and right)."""
y = x.right
# 1. Update x's right child to be y's left child
x.right = y.left
if y.left:
y.left.parent = x

Check failure on line 26 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:26:1: W293 Blank line contains whitespace
# 2. Update y's parent to be x's parent
y.parent = x.parent
if not x.parent:
self.root = y # y becomes the new root
elif x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y

Check failure on line 35 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:35:1: W293 Blank line contains whitespace
# 3. Update y's left child to be x
y.left = x
x.parent = y

def _rotate_right(self, x):
"""Perform a right rotation around node x (moving x down and left)."""
y = x.left
# 1. Update x's left child to be y's right child
x.left = y.right
if y.right:
y.right.parent = x

Check failure on line 47 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:47:1: W293 Blank line contains whitespace
# 2. Update y's parent to be x's parent
y.parent = x.parent
if not x.parent:
self.root = y # y becomes the new new root
elif x == x.parent.right:
x.parent.right = y
else:
x.parent.left = y

Check failure on line 56 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:56:1: W293 Blank line contains whitespace
# 3. Update y's right child to be x
y.right = x
x.parent = y

# --- Core Splay Operation ---

Check failure on line 62 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:62:1: W293 Blank line contains whitespace
def _splay(self, x):
"""Moves node x to the root of the tree using a sequence of rotations."""
while x.parent:
parent = x.parent
grandparent = parent.parent

Check failure on line 68 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:68:1: W293 Blank line contains whitespace
if not grandparent:
# Zig Case (x is a child of the root)
# One single rotation (Right if x is left child, Left if x is right child)

Check failure on line 71 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

data_structures/binary_tree/splay_tree.py:71:89: E501 Line too long (90 > 88)
if x == parent.left:
self._rotate_right(parent)
else:
self._rotate_left(parent)

Check failure on line 76 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

data_structures/binary_tree/splay_tree.py:76:1: W293 Blank line contains whitespace
else:
# Two rotations are performed: Zig-Zig or Zig-Zag

# Case 1: Zig-Zig (x, parent, and grandparent are all on one side)
if (x == parent.left and parent == grandparent.left):

Check failure on line 81 in data_structures/binary_tree/splay_tree.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (PLR5501)

data_structures/binary_tree/splay_tree.py:77:13: PLR5501 Use `elif` instead of `else` then `if`, to reduce indentation
# x and parent are both left children (Left-Left)
self._rotate_right(grandparent) # Rotate grandparent down
self._rotate_right(parent) # Rotate parent down
elif (x == parent.right and parent == grandparent.right):
# x and parent are both right children (Right-Right)
self._rotate_left(grandparent) # Rotate grandparent down
self._rotate_left(parent) # Rotate parent down

# Case 2: Zig-Zag (x is on one side, parent is on the other)
elif (x == parent.left and parent == grandparent.right):
# x is left child, parent is right child
self._rotate_right(parent) # Rotate parent first
self._rotate_left(grandparent) # Rotate grandparent next
else: # x == parent.right and parent == grandparent.left
# x is right child, parent is left child
self._rotate_left(parent) # Rotate parent first
self._rotate_right(grandparent) # Rotate grandparent next

# --- Example Search Method (Uses splay) ---

def search(self, key):
"""Searches for a key. If found, splays it to the root."""
current = self.root
found_node = None
while current:
if key == current.key:
found_node = current
break
elif key < current.key:
current = current.left
else:
current = current.right

if found_node:
self._splay(found_node) # Node is brought to the root
return True
return False