-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbinarySearchTree.py
126 lines (102 loc) · 3.58 KB
/
binarySearchTree.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Binary Tree implementation using Linked List
# Create Traverse Search Insert Delete
# Binary tree has always at most 2 children
# BST Insert and Delete is much faster than BT
# in BST left side values are less than root node
# and right side is greater than right side
# always working on half of the tree
# this module could be found in the Stack-Queue repo
import QueueLinkedList as queue
class BSTNode:
def __init__(self, data):
self.data = data
self.leftChild = None
self.rightChild = None
def insertNode(root_node, node_value):
if root_node.data == None:
root_node.data = node_value
elif node_value <= root_node.data:
if root_node.leftChild is None:
root_node.leftChild = BSTNode(node_value)
else:
insertNode(root_node.leftChild, node_value)
else:
if root_node.rightChild is None:
root_node.rightChild = BSTNode(node_value)
else:
insertNode(root_node.rightChild, node_value)
return "Inserted"
def preOrderTraversal(root_node):
if not root_node:
return
print(root_node.data)
preOrderTraversal(root_node.leftChild)
preOrderTraversal(root_node.rightChild)
def inOrderTraversal(root_node):
if not root_node:
return
inOrderTraversal(root_node.leftChild)
print(root_node.data)
inOrderTraversal(root_node.rightChild)
def postOrderTraversal(root_node):
if not root_node:
return
postOrderTraversal(root_node.leftChild)
postOrderTraversal(root_node.rightChild)
print(root_node.data)
def levelOrderTraversal(root_node):
if not root_node:
return
else:
customQueue = queue.Queue()
customQueue.enqueue(root_node)
while not(customQueue.isEmpty()):
root = customQueue.dequeue()
print(root.value.data)
if root.value.leftChild is not None:
customQueue.enqueue(root.value.leftChild)
if root.value.rightChild is not None:
customQueue.enqueue(root.value.rightChild)
def searchNode(root_node, node_value):
if root_node.data == node_value:
print("The value is found")
elif node_value < root_node.data:
if root_node.leftChild.data == node_value:
print("The value is found")
else:
searchNode(root_node.leftChild, node_value)
else:
if root_node.rightChild.data == node_value:
print("The value is found")
else:
searchNode(root_node.rightChild, node_value)
def minValueNode(bstNode):
current = bstNode
while (current.leftChild is not None):
current = current.leftChild
return current
def deleteNode(root_node, node_value):
if root_node is None:
return root_node
if node_value < root_node.data:
root_node.leftChild = deleteNode(root_node.leftChild, node_value)
elif node_value > root_node.data:
root_node.rightChild = deleteNode(root_node.rightChild, node_value)
else:
if root_node.leftChild is None:
temp = root_node.rightChild
root_node = None
return temp
if root_node.rightChild is None:
temp = root_node.leftChild
root_node = None
return temp
temp = minValueNode(root_node.rightChild)
root_node.data = temp.data
root_node.rightChild = deleteNode(root_node.rightChild, temp.data)
return root_node
def deleteBST(root_node):
root_node.data = None
root_node.leftChild = None
root_node.rightChild = None
return "Deleted"