|
|
|
@ -0,0 +1,107 @@
|
|
|
|
|
# Linear Search
|
|
|
|
|
def linearSearch ( data, target ):
|
|
|
|
|
for index, dataItem in enumerate(data):
|
|
|
|
|
if dataItem == target:
|
|
|
|
|
return index
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
# Binary Search
|
|
|
|
|
def binarySearch (data, target ):
|
|
|
|
|
while True:
|
|
|
|
|
dataItem = data[len(data)//2]
|
|
|
|
|
if dataItem == target:
|
|
|
|
|
return len(data)//2
|
|
|
|
|
elif dataItem < target:
|
|
|
|
|
data = data[len(data)//2:]
|
|
|
|
|
elif dataItem > target:
|
|
|
|
|
data = data[:len(data)//2]
|
|
|
|
|
elif len(data) == 1:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
# Node Class
|
|
|
|
|
class Node:
|
|
|
|
|
# Constructor
|
|
|
|
|
def __init__(self, value):
|
|
|
|
|
self.value = value
|
|
|
|
|
self.leftNode = None
|
|
|
|
|
self.rightNode = None
|
|
|
|
|
|
|
|
|
|
# Binary Tree Class
|
|
|
|
|
class BinaryTree:
|
|
|
|
|
# Constructor
|
|
|
|
|
def __init__(self, value):
|
|
|
|
|
self.tree = Node(value)
|
|
|
|
|
# Traverse
|
|
|
|
|
@staticmethod
|
|
|
|
|
def __traverse(node, directions):
|
|
|
|
|
for direction in directions:
|
|
|
|
|
if direction == "left":
|
|
|
|
|
node = node.leftNode
|
|
|
|
|
if direction == "right":
|
|
|
|
|
node = node.rightNode
|
|
|
|
|
return node
|
|
|
|
|
# Add Node
|
|
|
|
|
def add_node(self, value):
|
|
|
|
|
tree = self.tree
|
|
|
|
|
while True:
|
|
|
|
|
if value > tree.value:
|
|
|
|
|
if tree.rightNode is None:
|
|
|
|
|
tree.rightNode = Node(value)
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
tree = self.__traverse(tree, ["right"])
|
|
|
|
|
if value < tree.value or value == tree.value:
|
|
|
|
|
if tree.leftNode is None:
|
|
|
|
|
tree.leftNode = Node(value)
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
tree = self.__traverse(tree, ["left"])
|
|
|
|
|
# Left Branch
|
|
|
|
|
@staticmethod
|
|
|
|
|
def __left_branch(node_tree):
|
|
|
|
|
if node_tree.leftNode is not None:
|
|
|
|
|
print(f"Parent: {node_tree.value}, Left Child: {node_tree.leftNode.value}")
|
|
|
|
|
return node_tree.leftNode
|
|
|
|
|
return None
|
|
|
|
|
# Right Branch
|
|
|
|
|
@staticmethod
|
|
|
|
|
def __right_branch(node_tree):
|
|
|
|
|
if node_tree.rightNode is not None:
|
|
|
|
|
print(f"Parent: {node_tree.value}, Right Child: {node_tree.rightNode.value}")
|
|
|
|
|
return node_tree.rightNode
|
|
|
|
|
return None
|
|
|
|
|
# Display Tree
|
|
|
|
|
def display_tree(self, node_tree):
|
|
|
|
|
left_node = self.__left_branch(node_tree)
|
|
|
|
|
right_node = self.__right_branch(node_tree)
|
|
|
|
|
if left_node is not None:
|
|
|
|
|
self.display_tree(left_node)
|
|
|
|
|
if right_node is not None:
|
|
|
|
|
self.display_tree(right_node)
|
|
|
|
|
|
|
|
|
|
# Read Data
|
|
|
|
|
with open("./data/string.txt", "r") as file:
|
|
|
|
|
textArray = file.read().split("\n")
|
|
|
|
|
with open("./data/numbers.txt", "r") as file:
|
|
|
|
|
numberArray = file.read().split("\n")
|
|
|
|
|
for itemIndex, item in enumerate(numberArray):
|
|
|
|
|
numberArray[itemIndex] = int(item)
|
|
|
|
|
|
|
|
|
|
# Searches
|
|
|
|
|
print(linearSearch(textArray, "hello"))
|
|
|
|
|
print(binarySearch(numberArray, 11))
|
|
|
|
|
|
|
|
|
|
# Binary Tree
|
|
|
|
|
tree = BinaryTree(0)
|
|
|
|
|
tree.add_node(8)
|
|
|
|
|
tree.add_node(-4)
|
|
|
|
|
tree.add_node(-1)
|
|
|
|
|
tree.add_node(10)
|
|
|
|
|
tree.add_node(-6)
|
|
|
|
|
tree.add_node(-5)
|
|
|
|
|
tree.add_node(7)
|
|
|
|
|
tree.add_node(11)
|
|
|
|
|
tree.add_node(0)
|
|
|
|
|
tree.add_node(69)
|
|
|
|
|
tree.add_node(68)
|
|
|
|
|
tree.display_tree(tree.tree)
|