Ann2p Zc7ud
Ann2p Zc7ud
class Node:
self.value = value
self.left = None
self.right = None
self.parent = None
class RedBlackTree:
def __init__(self):
self.root = self.TNULL
new_node = Node(value)
new_node.left = self.TNULL
new_node.right = self.TNULL
new_node.color = "red"
parent = None
current = self.root
current = current.left
else:
current = current.right
new_node.parent = parent
if not parent:
self.root = new_node
parent.left = new_node
else:
parent.right = new_node
self.fix_insert(new_node)
if k.parent == k.parent.parent.right:
u.color = "black"
k.parent.color = "black"
k.parent.parent.color = "red"
k = k.parent.parent
else:
k = k.parent
self.rotate_right(k)
k.parent.parent.color = "red"
self.rotate_left(k.parent.parent)
else:
u.color = "black"
k.parent.color = "black"
k.parent.parent.color = "red"
k = k.parent.parent
else:
k = k.parent
self.rotate_left(k)
k.parent.parent.color = "red"
self.rotate_right(k.parent.parent)
if k == self.root:
break
self.root.color = "black"
def delete(self, value):
self.delete_node_helper(self.root, value)
z = self.TNULL
if node.value == key:
z = node
node = node.right
else:
node = node.left
if z == self.TNULL:
return
y=z
y_original_color = y.color
if z.left == self.TNULL:
x = z.right
self.transplant(z, z.right)
x = z.left
self.transplant(z, z.left)
else:
y = self.minimum(z.right)
y_original_color = y.color
x = y.right
if y.parent == z:
x.parent = y
else:
self.transplant(y, y.right)
y.right = z.right
y.right.parent = y
self.transplant(z, y)
y.left = z.left
y.left.parent = y
y.color = z.color
if y_original_color == "black":
self.fix_delete(x)
if x == x.parent.left:
s = x.parent.right
if s.color == "red":
s.color = "black"
x.parent.color = "red"
self.rotate_left(x.parent)
s = x.parent.right
s.color = "red"
x = x.parent
else:
if s.right.color == "black":
s.left.color = "black"
s.color = "red"
self.rotate_right(s)
s = x.parent.right
s.color = x.parent.color
x.parent.color = "black"
s.right.color = "black"
self.rotate_left(x.parent)
x = self.root
else:
s = x.parent.left
if s.color == "red":
s.color = "black"
x.parent.color = "red"
self.rotate_right(x.parent)
s = x.parent.left
s.color = "red"
x = x.parent
else:
if s.left.color == "black":
s.right.color = "black"
s.color = "red"
self.rotate_left(s)
s = x.parent.left
s.color = x.parent.color
x.parent.color = "black"
s.left.color = "black"
self.rotate_right(x.parent)
x = self.root
x.color = "black"
y = x.right
x.right = y.left
if y.left != self.TNULL:
y.left.parent = x
y.parent = x.parent
if not x.parent:
self.root = y
elif x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y
y.left = x
x.parent = y
y = x.left
x.left = y.right
if y.right != self.TNULL:
y.right.parent = x
y.parent = x.parent
if not x.parent:
self.root = y
elif x == x.parent.right:
x.parent.right = y
else:
x.parent.left = y
y.right = x
x.parent = y
def transplant(self, u, v):
if not u.parent:
self.root = v
elif u == u.parent.left:
u.parent.left = v
else:
u.parent.right = v
v.parent = u.parent
node = node.left
return node
if node != self.TNULL:
self.inorder(node.left)
self.inorder(node.right)
# Usage
tree = RedBlackTree()
tree.insert(value)
tree.inorder(tree.root)
print("\nDeleting 10...")
tree.delete(10)
tree.inorder(tree.root)
After deletion of 10
AVL tree
class Node:
self.value = value
self.left = None
self.right = None
self.height = 1
class AVLTree:
if not node:
return 0
return node.height
if not node:
return 0
x = y.left
T2 = x.right
x.right = y
y.left = T2
return x
y = x.right
T2 = y.left
y.left = x
x.right = T2
if not root:
return Node(value)
else:
balance = self.get_balance(root)
return self.rotate_right(root)
return self.rotate_left(root)
root.left = self.rotate_left(root.left)
return self.rotate_right(root)
root.right = self.rotate_right(root.right)
return self.rotate_left(root)
return root
current = node
while current.left:
current = current.left
return current
if not root:
return root
else:
if not root.left:
return root.right
return root.left
temp = self.min_value_node(root.right)
root.value = temp.value
balance = self.get_balance(root)
return self.rotate_right(root)
root.left = self.rotate_left(root.left)
return self.rotate_right(root)
return self.rotate_left(root)
# Right Left Case
root.right = self.rotate_right(root.right)
return self.rotate_left(root)
return root
if not root:
return
self.inorder(root.left)
self.inorder(root.right)
# Usage
avl_tree = AVLTree()
root = None
# Insert nodes
# Delete nodes
print("\n\nDeleting 60...")
avl_tree.inorder(root)
print("\n\nDeleting 80...")
avl_tree.inorder(root)
Root: 20
Root: 20
R--- 60
Root: 60
L--- 20
R--- 80
Root: 60
L--- 20
R--- 80
R--- 100
Root: 60
L--- 20
R--- 100
L--- 80
R--- 120
Root: 80
L--- 60
L--- 20
R--- 70
R--- 100
R--- 120
Root: 80
L--- 70
L--- 20
R--- 100
R--- 120
Root: 100
L--- 70
L--- 20
R--- 120