Adding trees and graphss

This commit is contained in:
Donald Calloway 2025-10-12 10:37:29 -07:00
parent f7512a5b34
commit 7375ac157c
4 changed files with 210 additions and 12 deletions

102
binary_search_tree.py Normal file
View File

@ -0,0 +1,102 @@
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
# Inorder traversal
def inorder(root):
if root is not None:
# Traverse left
inorder(root.left)
# Traverse root
print(str(root.key) + "->", end=' ')
# Traverse right
inorder(root.right)
# Insert a node
def insert(node, key):
# Return a new node if the tree is empty
if node is None:
return Node(key)
# Traverse to the right place and insert the node
if key < node.key:
node.left = insert(node.left, key)
else:
node.right = insert(node.right, key)
return node
# Find the inorder successor
def minValueNode(node):
current = node
# Find the leftmost leaf
while(current.left is not None):
current = current.left
return current
# Deleting a node
def deleteNode(root, key):
# Return if the tree is empty
if root is None:
return root
# Find the node to be deleted
if key < root.key:
root.left = deleteNode(root.left, key)
elif(key > root.key):
root.right = deleteNode(root.right, key)
else:
# If the node is with only one child or no child
if root.left is None:
temp = root.right
root = None
return temp
elif root.right is None:
temp = root.left
root = None
return temp
# If the node has two children,
# place the inorder successor in position of the node to be deleted
temp = minValueNode(root.right)
root.key = temp.key
# Delete the inorder successor
root.right = deleteNode(root.right, temp.key)
return root
root = None
root = insert(root, 9)
root = insert(root, 3)
root = insert(root, 2)
root = insert(root, 4)
root = insert(root, 7)
root = insert(root, 10)
root = insert(root, 15)
root = insert(root, 5)
print("Inorder traversal: ", end=' ')
inorder(root)
print("\nDelete 10")
root = deleteNode(root, 10)
print("Inorder traversal: ", end=' ')
inorder(root)

46
binary_tree.py Normal file
View File

@ -0,0 +1,46 @@
class Node:
def __init__(self, key):
self.left = None
self.right = None
self.val = key
# Traverse preorder
def traversePreOrder(self):
print(self.val, end=' ')
if self.left:
self.left.traversePreOrder()
if self.right:
self.right.traversePreOrder()
# Traverse inorder
def traverseInOrder(self):
if self.left:
self.left.traverseInOrder()
print(self.val, end=' ')
if self.right:
self.right.traverseInOrder()
# Traverse postorder
def traversePostOrder(self):
if self.left:
self.left.traversePostOrder()
if self.right:
self.right.traversePostOrder()
print(self.val, end=' ')
root = Node(5)
root.left = Node(6)
root.right = Node(7)
root.left.left = Node(8)
print("Preorder Traversal: ", end="")
root.traversePreOrder()
print("\nInorder Traversal: ", end="")
root.traverseInOrder()
print("\nPostorder Traversal: ", end="")
root.traversePostOrder()

40
graph.py Normal file
View File

@ -0,0 +1,40 @@
class Graph:
def __init__(self):
self.graph = {}
def add_vertex(self, vertex):
if vertex not in self.graph:
self.graph[vertex] = []
else:
print(f"Vertex {vertex} already exists.")
def add_edge(self, vertex1, vertex2, length:int):
if vertex1 in self.graph and vertex2 in self.graph:
self.graph[vertex1].append(vertex2)
self.graph[vertex2].append(vertex1)
self.length = length
else:
print("One or both vertices not found.")
def display(self):
for vertex in self.graph:
print(f'{vertex}: {self.graph[vertex]} : {self.length}' )
# Example usage
if __name__ == "__main__":
g = Graph()
# Adding vertices
g.add_vertex("A")
g.add_vertex("B")
g.add_vertex("C")
g.add_vertex("D")
# Adding edges
g.add_edge("A", "B", 10)
g.add_edge("A", "C", 5)
g.add_edge("B", "D", 30)
g.add_edge("C", "D", 11)
# Display the graph
g.display()

View File

@ -11,7 +11,7 @@ class Graph:
else:
print(f"Vertex {vertex} already exists.")
def add_edge(self, vertex1, vertex2, length: int):
def add_edge(self, vertex1, vertex2, length: float):
if vertex1 in self.graph and vertex2 in self.graph:
self.graph[vertex1].append(vertex2)
self.graph[vertex2].append(vertex1)
@ -63,18 +63,28 @@ class Graph:
# Example usage
g = Graph()
g.add_vertex("A")
g.add_vertex("B")
g.add_vertex("C")
g.add_vertex("D")
g.add_vertex("E")
g.add_edge("A", "B", 10)
g.add_edge("A", "C", 5)
g.add_edge("B", "D", 30)
g.add_edge("C", "D", 11)
g.add_edge("B", "E", 5)
# City node abbreviations
A = "San Tan Valley"
B = "Phoenix"
C = "Globe"
D = "Mesa"
E = "Florence"
# Adding nodes to graph
g.add_vertex(A)
g.add_vertex(B)
g.add_vertex(C)
g.add_vertex(D)
g.add_vertex(E)
# Adding edges to graph
g.add_edge(A, B, 34)
g.add_edge(A, C, 47)
g.add_edge(B, D, 18.8)
g.add_edge(C, D, 13)
g.add_edge(B, E, 63)
g.display()
g.dijkstra("A", "D")
g.dijkstra(A, D)