trees organized

This commit is contained in:
Mari Wahl 2015-01-07 13:43:37 -05:00
parent 28b84cef65
commit 52752fb931
16 changed files with 262 additions and 689 deletions

90
src/trees/binary_search_tree.py Normal file → Executable file
View file

@ -1,73 +1,103 @@
#!/usr/bin/python
__author__ = "Mari Wahl"
__email__ = "marina.w4hl@gmail.com"
__author__ = "bt3"
from binary_tree import NodeBT, BinaryTree
class Node(object):
def __init__(self, item=None,):
class NodeBST(NodeBT):
def __init__(self, item=None, level=0):
self.item = item
self.level = level
self.left = None
self.right = None
def __repr__(self):
return '{}'.format(self.item)
def _add(self, value):
new_node = Node(value)
def _addNextNode(self, value, level_here=1):
new_node = NodeBST(value, level_here)
if not self.item:
self.item = new_node
else:
if value > self.item:
self.right = self.right and self.right._addNextNode(value, level_here+1) or new_node
self.right = self.right and self.right._add(value) or new_node
elif value < self.item:
self.left = self.left and self.left._addNextNode(value, level_here+1) or new_node
self.left = self.left and self.left._add(value) or new_node
else:
print("BSTs do not support repeated items.")
return self # this is necessary!!!
def _searchForNode(self, value):
def _search(self, value):
if self.item == value:
return self
return True # or self
elif self.left and value < self.item:
return self.left._searchForNode(value)
return self.left._search(value)
elif self.right and value > self.item:
return self.right._searchForNode(value)
return self.right._search(value)
else:
return False
def _isLeaf(self):
return not self.right and not self.left
class BinarySearchTree(BinaryTree):
def _printPreorder(self):
print self.item
if self.left:
return self.left._printPreorder()
if self.right:
return self.right._printPreorder()
class BST(object):
def __init__(self):
self.root = None
def addNode(self, value):
def add(self, value):
if not self.root:
self.root = NodeBST(value)
self.root = Node(value)
else:
self.root._addNextNode(value)
self.root._add(value)
def printPreorder(self):
if self.root:
self.root._printPreorder()
def search(self, value):
if self.root:
return self.root._search(value)
if __name__ == '__main__':
bst = BinarySearchTree()
bst = BST()
print "Adding nodes 1 to 10 in the tree..."
for i in range(1, 10):
bst.addNode(i)
print "Is 8 a leaf? ", bst.isLeaf(8)
print "Whats the level of node 8? ", bst.getNodeLevel(8)
print "Is node 10 a root? ", bst.isRoot(10)
print "Is node 1 a root? ", bst.isRoot(1)
print "Whats the tree height? ", bst.getHeight()
print "Is this tree BST? ", bst.isBST()
print "Is this tree balanced? ", bst.isBalanced()
for i in range(1, 11):
bst.add(i)
print
print "Searching for nodes 16 and 6"
print bst.search(16)
print bst.search(6)
print
print "Printing preorder..."
bst.printPreorder()