Reorganizing files only
This commit is contained in:
214
Trees/BinarySearchTree.py
Normal file
214
Trees/BinarySearchTree.py
Normal file
@@ -0,0 +1,214 @@
|
||||
# Binary Search Tree in Python
|
||||
|
||||
class Node:
|
||||
def __init__(self, val):
|
||||
self.value = val
|
||||
self.leftChild = None
|
||||
self.rightChild = None
|
||||
|
||||
def insert(self, data):
|
||||
if self.value == data:
|
||||
return False
|
||||
|
||||
elif self.value > data:
|
||||
if self.leftChild:
|
||||
return self.leftChild.insert(data)
|
||||
else:
|
||||
self.leftChild = Node(data)
|
||||
return True
|
||||
|
||||
else:
|
||||
if self.rightChild:
|
||||
return self.rightChild.insert(data)
|
||||
else:
|
||||
self.rightChild = Node(data)
|
||||
return True
|
||||
|
||||
def find(self, data):
|
||||
if(self.value == data):
|
||||
return True
|
||||
elif self.value > data:
|
||||
if self.leftChild:
|
||||
return self.leftChild.find(data)
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
if self.rightChild:
|
||||
return self.rightChild.find(data)
|
||||
else:
|
||||
return False
|
||||
|
||||
def getHeight(self):
|
||||
if self.leftChild and self.rightChild:
|
||||
return 1 + max(self.leftChild.getHeight(), self.rightChild.getHeight())
|
||||
elif self.leftChild:
|
||||
return 1 + self.leftChild.getHeight()
|
||||
elif self.rightChild:
|
||||
return 1 + self.rightChild.getHeight()
|
||||
else:
|
||||
return 1
|
||||
|
||||
def preorder(self):
|
||||
if self:
|
||||
print (str(self.value))
|
||||
if self.leftChild:
|
||||
self.leftChild.preorder()
|
||||
if self.rightChild:
|
||||
self.rightChild.preorder()
|
||||
|
||||
def postorder(self):
|
||||
if self:
|
||||
if self.leftChild:
|
||||
self.leftChild.postorder()
|
||||
if self.rightChild:
|
||||
self.rightChild.postorder()
|
||||
print (str(self.value))
|
||||
|
||||
def inorder(self):
|
||||
if self:
|
||||
if self.leftChild:
|
||||
self.leftChild.inorder()
|
||||
print (str(self.value))
|
||||
if self.rightChild:
|
||||
self.rightChild.inorder()
|
||||
|
||||
class Tree:
|
||||
def __init__(self):
|
||||
self.root = None
|
||||
|
||||
def insert(self, data):
|
||||
if self.root:
|
||||
return self.root.insert(data)
|
||||
else:
|
||||
self.root = Node(data)
|
||||
return True
|
||||
|
||||
def find(self, data):
|
||||
if self.root:
|
||||
return self.root.find(data)
|
||||
else:
|
||||
return False
|
||||
|
||||
def getHeight(self):
|
||||
if self.root:
|
||||
return self.root.getHeight()
|
||||
else:
|
||||
return -1
|
||||
|
||||
def remove(self, data):
|
||||
# empty tree
|
||||
if self.root is None:
|
||||
return False
|
||||
|
||||
# data is in root node
|
||||
elif self.root.value == data:
|
||||
if self.root.leftChild is None and self.root.rightChild is None:
|
||||
self.root = None
|
||||
elif self.root.leftChild and self.root.rightChild is None:
|
||||
self.root = self.root.leftChild
|
||||
elif self.root.leftChild is None and self.root.rightChild:
|
||||
self.root = self.root.rightChild
|
||||
elif self.root.leftChild and self.root.rightChild:
|
||||
delNodeParent = self.root
|
||||
delNode = self.root.rightChild
|
||||
while delNode.leftChild:
|
||||
delNodeParent = delNode
|
||||
delNode = delNode.leftChild
|
||||
|
||||
self.root.value = delNode.value
|
||||
if delNode.rightChild:
|
||||
if delNodeParent.value > delNode.value:
|
||||
delNodeParent.leftChild = delNode.rightChild
|
||||
elif delNodeParent.value < delNode.value:
|
||||
delNodeParent.rightChild = delNode.rightChild
|
||||
else:
|
||||
if delNode.value < delNodeParent.value:
|
||||
delNodeParent.leftChild = None
|
||||
else:
|
||||
delNodeParent.rightChild = None
|
||||
|
||||
return True
|
||||
|
||||
parent = None
|
||||
node = self.root
|
||||
|
||||
# find node to remove
|
||||
while node and node.value != data:
|
||||
parent = node
|
||||
if data < node.value:
|
||||
node = node.leftChild
|
||||
elif data > node.value:
|
||||
node = node.rightChild
|
||||
|
||||
# case 1: data not found
|
||||
if node is None or node.value != data:
|
||||
return False
|
||||
|
||||
# case 2: remove-node has no children
|
||||
elif node.leftChild is None and node.rightChild is None:
|
||||
if data < parent.value:
|
||||
parent.leftChild = None
|
||||
else:
|
||||
parent.rightChild = None
|
||||
return True
|
||||
|
||||
# case 3: remove-node has left child only
|
||||
elif node.leftChild and node.rightChild is None:
|
||||
if data < parent.value:
|
||||
parent.leftChild = node.leftChild
|
||||
else:
|
||||
parent.rightChild = node.leftChild
|
||||
return True
|
||||
|
||||
# case 4: remove-node has right child only
|
||||
elif node.leftChild is None and node.rightChild:
|
||||
if data < parent.value:
|
||||
parent.leftChild = node.rightChild
|
||||
else:
|
||||
parent.rightChild = node.rightChild
|
||||
return True
|
||||
|
||||
# case 5: remove-node has left and right children
|
||||
else:
|
||||
delNodeParent = node
|
||||
delNode = node.rightChild
|
||||
while delNode.leftChild:
|
||||
delNodeParent = delNode
|
||||
delNode = delNode.leftChild
|
||||
|
||||
node.value = delNode.value
|
||||
if delNode.rightChild:
|
||||
if delNodeParent.value > delNode.value:
|
||||
delNodeParent.leftChild = delNode.rightChild
|
||||
elif delNodeParent.value < delNode.value:
|
||||
delNodeParent.rightChild = delNode.rightChild
|
||||
else:
|
||||
if delNode.value < delNodeParent.value:
|
||||
delNodeParent.leftChild = None
|
||||
else:
|
||||
delNodeParent.rightChild = None
|
||||
|
||||
def preorder(self):
|
||||
if self.root is not None:
|
||||
print("PreOrder")
|
||||
self.root.preorder()
|
||||
|
||||
def postorder(self):
|
||||
if self.root is not None:
|
||||
print("PostOrder")
|
||||
self.root.postorder()
|
||||
|
||||
def inorder(self):
|
||||
if self.root is not None:
|
||||
print("InOrder")
|
||||
self.root.inorder()
|
||||
|
||||
bst = Tree()
|
||||
print(bst.insert(10))
|
||||
#print(bst.insert(5))
|
||||
bst.preorder()
|
||||
print(bst.getHeight())
|
||||
#bst.postorder()
|
||||
#bst.inorder()
|
||||
print(bst.remove(10))
|
||||
bst.preorder()
|
||||
Reference in New Issue
Block a user