mirror of
https://github.com/donnemartin/interactive-coding-challenges.git
synced 2024-03-22 13:11:13 +08:00
155 lines
3.1 KiB
Python
155 lines
3.1 KiB
Python
|
|
||
|
class Node (object):
|
||
|
def __init__ (self, data):
|
||
|
self.data = data
|
||
|
self.rightChild = None
|
||
|
self.leftChild = None
|
||
|
|
||
|
class BinaryTree (object):
|
||
|
def __init__ (self):
|
||
|
self.root = None
|
||
|
|
||
|
def insert (self, newData):
|
||
|
leaf = Node(newData)
|
||
|
|
||
|
if self.root is None:
|
||
|
self.root = leaf
|
||
|
else:
|
||
|
current = self.root
|
||
|
parent = self.root
|
||
|
while current is not None:
|
||
|
parent = current
|
||
|
if newData < current.data:
|
||
|
current = current.leftChild
|
||
|
else:
|
||
|
current = current.rightChild
|
||
|
|
||
|
if newData < parent.data:
|
||
|
parent.leftChild = leaf
|
||
|
else:
|
||
|
parent.rightChild = leaf
|
||
|
|
||
|
# returns false if the item to be deleted is not on the tree
|
||
|
def delete (self, data):
|
||
|
current = self.root
|
||
|
parent = self.root
|
||
|
isLeft = False
|
||
|
|
||
|
if current is None:
|
||
|
return False
|
||
|
|
||
|
while current is not None and current.data is not data:
|
||
|
parent = current
|
||
|
if data < current.data:
|
||
|
current = current.leftChild
|
||
|
isLeft = True
|
||
|
else:
|
||
|
current = current.rightChild
|
||
|
isLeft = False
|
||
|
|
||
|
if current is None:
|
||
|
return False
|
||
|
|
||
|
if current.leftChild is None and current.rightChild is None:
|
||
|
if current is self.root:
|
||
|
self.root = None
|
||
|
elif isLeft:
|
||
|
parent.leftChild = None
|
||
|
else:
|
||
|
parent.rightChild = None
|
||
|
|
||
|
elif current.rightChild is None:
|
||
|
if current is self.root:
|
||
|
self.root = current.leftChild
|
||
|
elif isLeft:
|
||
|
parent.leftChild = current.leftChild
|
||
|
else:
|
||
|
parent.rightChild = current.leftChild
|
||
|
|
||
|
elif current.rightChild is None:
|
||
|
if current is self.root:
|
||
|
self.root = current.rightChild
|
||
|
elif isLeft:
|
||
|
parent.lChild = current.rightChild
|
||
|
else:
|
||
|
parent.rightChild = current.rightChild
|
||
|
|
||
|
else:
|
||
|
succesor = current.rightChild
|
||
|
succesorParent = current
|
||
|
|
||
|
while succesor.leftChild is not None:
|
||
|
succesorParent = succesor
|
||
|
succesor = succesor.leftChild
|
||
|
|
||
|
if current is self.root:
|
||
|
self.root = succesor
|
||
|
elif isLeft:
|
||
|
parent.leftChild = succesor
|
||
|
else:
|
||
|
parent.rightChild = succesor
|
||
|
|
||
|
succesor.leftChild = current.leftChild
|
||
|
|
||
|
if succesor is not current.rightChild:
|
||
|
succesorParent.leftChild = succesor.rightChild
|
||
|
succesor.rightChild = current.rightChild
|
||
|
|
||
|
return True
|
||
|
|
||
|
|
||
|
def minNode (self):
|
||
|
current = self.root
|
||
|
while current.leftChild is not None:
|
||
|
current = current.leftChild
|
||
|
|
||
|
return current.data
|
||
|
|
||
|
def maxNode (self):
|
||
|
current = self.root
|
||
|
while current.rightChild is not None:
|
||
|
current = current.rightChild
|
||
|
|
||
|
return current.data
|
||
|
|
||
|
def printPostOrder (self):
|
||
|
global postOrder
|
||
|
postOrder = []
|
||
|
|
||
|
def PostOrder(node):
|
||
|
if node is not None:
|
||
|
PostOrder(node.leftChild)
|
||
|
PostOrder(node.rightChild)
|
||
|
postOrder.append(node.data)
|
||
|
|
||
|
PostOrder(self.root)
|
||
|
return postOrder
|
||
|
|
||
|
def printInOrder (self):
|
||
|
global inOrder
|
||
|
inOrder = []
|
||
|
|
||
|
def InOrder (node):
|
||
|
if node is not None:
|
||
|
InOrder(node.leftChild)
|
||
|
inOrder.append(node.data)
|
||
|
InOrder(node.rightChild)
|
||
|
|
||
|
InOrder(self.root)
|
||
|
return inOrder
|
||
|
|
||
|
def printPreOrder (self):
|
||
|
global preOrder
|
||
|
preOrder = []
|
||
|
|
||
|
def PreOrder (node):
|
||
|
if node is not None:
|
||
|
preOrder.append(node.data)
|
||
|
PreOrder(node.leftChild)
|
||
|
PreOrder(node.rightChild)
|
||
|
|
||
|
PreOrder(self.root)
|
||
|
return preOrder
|
||
|
|
||
|
def treeIsEmpty (self):
|
||
|
return self.root is None
|