Skip to content

Instantly share code, notes, and snippets.

@jon-dearaujo
Created July 9, 2019 13:19
Show Gist options
  • Select an option

  • Save jon-dearaujo/1f75e8aa33ef68214f554a8761594c1b to your computer and use it in GitHub Desktop.

Select an option

Save jon-dearaujo/1f75e8aa33ef68214f554a8761594c1b to your computer and use it in GitHub Desktop.
Binary Search Tree operations with Python
class Node:
def __init__(self, key=None, left=None, right=None, parent=None, value=1):
self.key = key
self.left = left
self.right = right
self.parent = parent
self.value = value
def insert(key, value, node, parent=None):
if not node:
print(value)
return Node(key=key, value=value, parent=parent)
if key == node.key:
return Node(key=key, left=node.left, right=node.right, parent=node.parent, value=value)
if key < node.key:
return Node(key=node.key, left=insert(key,2*node.value, node.left, node), right=node.right, value=node.value)
return Node(key=node.key, left=node.left, right=insert(key, 2*node.value+1, node.right, node), value=node.value)
def find_sucessor(node):
if not node:
return
if node.left:
return find_sucessor(node.left)
return node
def delete(key, node):
if not node or not key:
return
if key < node.key:
return Node(key=node.key, left=delete(key, node.left), right=node.right, parent=node.parent, value=node.value)
if key > node.key:
return Node(key=node.key, left=node.left, right=delete(key, node.right), parent=node.parent, value=node.value)
if key == node.key:
print(node.value)
if node.left and node.right:
sucessor = find_sucessor(node.right)
return Node(key=sucessor.key, left=node.left, right=delete(sucessor.key, node.right), parent=node.parent, value=node.value)
if node.left:
return Node(key=node.left.key, left=node.left.left, right=node.left.right, parent=node.parent, value=node.value)
if node.right:
return Node(key=node.right.key, left=node.right.left, right=node.right.right, parent=node.parent, value=node.value)
return None
def update_values(tree, parent=None):
if not tree:
return tree
if parent:
if parent.left and tree.key == parent.left.key:
tree.value = parent.value*2
return Node(key=tree.key, left=update_values(tree.left, tree), right=update_values(tree.right, tree), parent=parent, value=tree.value)
if parent.right and tree.key == parent.right.key:
tree.value = 2*parent.value+1
return Node(key=tree.key, left=update_values(tree.left, tree), right=update_values(tree.right, tree), parent=parent, value=tree.value)
return Node(key=tree.key, left=update_values(tree.left, tree), right=update_values(tree.right, tree), parent=parent, value=1)
def read_tree(tree):
if not tree:
return
print(tree.key, tree.value)
if tree.left:
read_tree(tree.left)
if tree.right:
read_tree(tree.right)
n_op = int(input())
tree = None
for n in range(n_op):
op_i = input()
op = op_i.split()[0]
key = int(op_i.split()[1])
if op == 'i':
tree = insert(key, 1, tree)
if op == 'd':
tree = delete(key, tree)
tree = update_values(tree)
read_tree(tree)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment