Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 80 additions & 76 deletions Binary_Search_Tree/bst.py
Original file line number Diff line number Diff line change
@@ -1,89 +1,93 @@
class BST:

def __init__(self,val,left,right):
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right

def addHelper(self,root,data):

# case for reaching current leafs, base cases
if root.val < data and root.right == None:
root.right = BST(data,None,None)
return "insertion completed"
elif root.val > data and root.left == None:
root.left = BST(data,None,None)
return "insertion completed"

# else we continue tracing downwards
if root.val < data:
return self.add(root.right,data)
elif root.val > data:
return self.add(root.left,data)
def addHelper(self, root, data):
if data < root.val:
if root.left is None:
root.left = BST(data)
return "insertion completed"
else:
return self.addHelper(root.left, data)
elif data > root.val:
if root.right is None:
root.right = BST(data)
return "insertion completed"
else:
return self.addHelper(root.right, data)
else:
return "insertion failed: duplicate value"

def add(self,root,data):
if root == None:
return "insertion failed: empty root"
return self.addHelper(root,data)

def restructdata(self,root):
# base case: we reach a leaf
if root == None or (root.left == None and root.right == None):
root = None
return "restructure finished"

# need dummy nodes to compare target value to children value
v1 = float('-inf')
v2 = float('inf')
if root.left != None:
v1 = root.left.val
if root.right != None:
v2 = root.right.val

temp = root.val
if v1 > v2 or v2 == float('inf'):
root.val = root.left.val
root.left.val = temp
return self.restructdata(root.left)
else:
root.val = root.right.val
root.right.val = temp
return self.restructdata(root.right)


def removeHelper(self,root,data):
if root == None:
return "deletion failed: could not find value"

# adhering to typical bst properties
if root.val < data:
return self.removeHelper(root.right,data)
elif root.val > data:
return self.removeHelper(root.left,data)

def add(self, data, root=None):
if root is None:
root = self
return self.addHelper(root, data)

def _get_min(self, root):
current = root
while current.left is not None:
current = current.left
return current.val

def removeHelper(self, root, data):
if root is None:
return root, False

deleted = False
if data < root.val:
root.left, deleted = self.removeHelper(root.left, data)
elif data > root.val:
root.right, deleted = self.removeHelper(root.right, data)
else:
temp = root.val
v1 = float('-inf')
v2 = float('inf')
if root.left != None:
v1 = root.left.val
elif root.right != None:
v2 = root.right.val

if v1 > v2 or v2 == float('inf'):
root.val = root.left.val
root.left.val = temp
return self.restructdata(root.left)
else:
root.val = root.right.val
root.right.val = temp
return self.restructdata(root.right)

def remove(self,root,data):
if root == None:
deleted = True
# Case 1: Leaf node
if root.left is None and root.right is None:
return None, True
# Case 2: One child
if root.left is None:
return root.right, True
if root.right is None:
return root.left, True
# Case 3: Two children - replace with in-order successor
min_val = self._get_min(root.right)
root.val = min_val
root.right, _ = self.removeHelper(root.right, min_val)

return root, deleted

def remove(self, data, root=None):
if root is None:
root = self

if root == self and self.val == data and self.left is None and self.right is None:
return "deletion failed: deleting from an empty tree"
return self.removeHelper(root,data)

_, deleted = self.removeHelper(root, data)
if deleted:
return "deletion completed"
return "deletion failed: could not find value"

def search(self, data):
if data == self.val:
return True
elif data < self.val and self.left:
return self.left.search(data)
elif data > self.val and self.right:
return self.right.search(data)
return False

def inorder(self):
result = []
if self.left:
result.extend(self.left.inorder())
result.append(self.val)
if self.right:
result.extend(self.right.inorder())
return result




Expand Down
69 changes: 41 additions & 28 deletions Converting_Roman_to_Integer/Converting_Roman_to_Integer.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,41 @@
import sys


romanStr = sys.argv[1]
romanStr = str(romanStr)
dict = {
'I':1,
'V':5,
'X':10,
'L':50,
'C':100,
'D':500,
'M':1000
}

num = 0

romanStr = romanStr.replace("IV","IIII")
romanStr = romanStr.replace("IX","VIIII")
romanStr = romanStr.replace("XL","XXXX")
romanStr = romanStr.replace("XC","LXXXX")
romanStr = romanStr.replace("CD","CCCC")
romanStr = romanStr.replace("CM","DCCCC")
myStr = list(romanStr)
for char in myStr:
num = num + dict[char]

print(num)
import sys

if len(sys.argv) > 1:
romanStr = sys.argv[1]
else:
romanStr = input("Enter a Roman numeral: ")

romanStr = str(romanStr).strip().upper()

if not romanStr:
print("Error: No Roman numeral provided.")
sys.exit(1)

ROMAN_VALUES = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}

invalid_chars = [char for char in romanStr if char not in ROMAN_VALUES]
if invalid_chars:
print(f"Error: Invalid Roman numeral character(s) '{''.join(set(invalid_chars))}'.")
sys.exit(1)

num = 0

romanStr = romanStr.replace("IV", "IIII")
romanStr = romanStr.replace("IX", "VIIII")
romanStr = romanStr.replace("XL", "XXXX")
romanStr = romanStr.replace("XC", "LXXXX")
romanStr = romanStr.replace("CD", "CCCC")
romanStr = romanStr.replace("CM", "DCCCC")

for char in romanStr:
num += ROMAN_VALUES[char]

print(num)