class testInOrder(unittest.TestCase): def setUp(self): self.my_bst = BSTree() self.filled_tree = BSTree() self.filled_tree.insert(5) self.filled_tree.insert(3) self.filled_tree.insert(6) self.filled_tree.insert(8) self.filled_tree.insert(11) self.filled_tree.insert(2) self.filled_tree.insert(9) # i just realized how unbalanced that tree is. bad design on my part. # i'll fix it for the following. self.number_catcher = [] def test_in_order_on_empty_bst(self): for i in self.my_bst.in_order(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, [None]) def test_in_order_on_filled_bst(self): for i in self.filled_tree.in_order(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, [2, 3, 5, 6, 8, 9, 11])
def test_insert(): tree = BSTree(4) tree.insert(2) tree.insert(6) tree.insert(1) tree.insert(3) tree.insert(5) tree.insert(7) tree.insert(8) tree.insert(0) assert tree.key == 4 assert tree.left.key == 2 assert tree.left.parent == tree assert tree.right.key == 6 assert tree.right.parent == tree assert tree.left.left.key == 1 assert tree.left.left.parent == tree.left assert tree.left.right.key == 3 assert tree.left.right.parent == tree.left assert tree.right.left.key == 5 assert tree.right.left.parent == tree.right assert tree.right.right.key == 7 assert tree.right.right.parent == tree.right assert tree.right.right.right.key == 8 assert tree.left.left.left.key == 0
def setUp(self): self.my_bst = BSTree() self.filled_tree = BSTree() self.filled_tree.insert(10) self.filled_tree.insert(5) self.filled_tree.insert(15) self.filled_tree.insert(2) self.filled_tree.insert(12) self.filled_tree.insert(7) self.filled_tree.insert(17) self.filled_tree.insert(1) self.filled_tree.insert(4) self.filled_tree.insert(6) self.filled_tree.insert(9) self.filled_tree.insert(11) self.filled_tree.insert(14) self.filled_tree.insert(16) self.filled_tree.insert(23) self.imbalanced_tree = BSTree() self.imbalanced_tree.insert(10) self.imbalanced_tree.insert(5) self.imbalanced_tree.insert(15) self.imbalanced_tree.insert(2) self.imbalanced_tree.insert(12) self.imbalanced_tree.insert(7) self.imbalanced_tree.insert(17) self.imbalanced_tree.insert(4) self.imbalanced_tree.insert(6) self.imbalanced_tree.insert(9) self.imbalanced_tree.insert(14) self.imbalanced_tree.insert(23) self.number_catcher = []
def __init__(self): """ AVL tree is essentailly a binary search tree and inherits the property of a binary search tree (left subtree < parent and right subtree > parent). """ BSTree.__init__(self)
def setUp(self): self.my_bst = BSTree() self.solo_tree = BSTree() self.solo_tree.insert(10) self.left_tree = BSTree() self.left_tree.insert(10) self.left_tree.insert(5) self.right_tree = BSTree() self.right_tree.insert(10) self.right_tree.insert(15) self.filled_tree = BSTree() self.filled_tree.insert(10) self.filled_tree.insert(5) self.filled_tree.insert(15) self.filled_tree.insert(2) self.filled_tree.insert(12) self.filled_tree.insert(7) self.filled_tree.insert(17) self.filled_tree.insert(1) self.filled_tree.insert(4) self.filled_tree.insert(6) self.filled_tree.insert(9) self.filled_tree.insert(11) self.filled_tree.insert(14) self.filled_tree.insert(16) self.filled_tree.insert(23)
def __init__(self, layer): """Verifier for a layer of wires. Once created, the verifier can list the crossings between wires (the wire_crossings method) or count the crossings (count_crossings).""" self.horizontal = [] self.verticalLines = [] self.events = [] self._events_from_layer(layer) self.events.sort() #array sort o(nlogn) self.horizontal.sort() arr = self.horizontal[:1] for i in range(1, len(self.horizontal)): if self.horizontal[i][0] != arr[len(arr) - 1][0]: arr.append(self.horizontal[i]) else: arr[len(arr) - 1][1] = arr[len(arr) - 1][1] + self.horizontal[i][1] self.horizontalLines = BSTree(arr) # for i in range(0, len(arr)): # print repr(arr[i]) + '\n' # print self.horizontalLines.displayTree() self.index = RangeIndex() self.result_set = ResultSet() self.performed = False
def test_init_bstree(): tree = BSTree(4) assert tree.key == 4 assert tree.parent is None assert tree.left is None assert tree.right is None assert tree.size() == 1
def setUp(self): self.my_bst = BSTree() self.filled_tree = BSTree() self.filled_tree.insert(5) self.filled_tree.insert(3) self.filled_tree.insert(6) self.filled_tree.insert(8) self.filled_tree.insert(11) self.filled_tree.insert(2)
def test_rebalance_rotate_right(): tree = BSTree(3) tree.left = BSTree(2, tree) tree.left.left = BSTree(1, tree.left) tree.rebalance() actual = [n.key for n in tree.breadth_first()] expected = [2, 1, 3] assert tree.depth() == 2 assert tree.balance() == 0 assert actual == expected
def setUp(self): self.my_bst = BSTree() self.filled_tree = BSTree() self.filled_tree.insert(5) self.filled_tree.insert(3) self.filled_tree.insert(6) self.filled_tree.insert(8) self.filled_tree.insert(11) self.filled_tree.insert(2) self.filled_tree.insert(9) # i just realized how unbalanced that tree is. bad design on my part. # i'll fix it for the following. self.number_catcher = []
def perfect_tree(): tree = BSTree(4) tree.insert(2) tree.insert(6) tree.insert(1) tree.insert(3) tree.insert(5) tree.insert(7) return tree
def test_insert_avl_single_left_branch(): tree = BSTree() for i in xrange(7, 0, -1): tree.insert(i) actual = [n.key for n in tree.breadth_first()] expected = [4, 2, 6, 1, 3, 5, 7] assert tree.depth() == 3 assert tree.balance() == 0 assert actual == expected
def right_heavy(): tree = BSTree(4) tree.insert(2) tree.insert(6) tree.insert(5) tree.insert(7) return tree
def left_heavy(): tree = BSTree(4) tree.insert(2) tree.insert(6) tree.insert(1) tree.insert(3) return tree
class TestingTheBasics(unittest.TestCase): """To make sure the basic parts of this work.""" def setUp(self): self.my_bst = BSTree() def test_if_the_blind_single_tree_init_works(self): self.assertEqual(self.my_bst.value, None) self.assertEqual(self.my_bst.right, None) self.assertEqual(self.my_bst.left, None) def test_the_insert_function(self): self.my_bst.insert(5) self.assertEqual(self.my_bst.value, 5) def test_inserting_subtrees_left_and_right(self): self.my_bst.insert(5) self.my_bst.insert(3) self.assertEqual(self.my_bst.left.value, 3) self.my_bst.insert(6) self.assertEqual(self.my_bst.right.value, 6) #now to make sure there's no ghost data hanging around. self.assertIsNone(self.my_bst.right.left) self.assertIsNone(self.my_bst.right.right) def test_filling_up_a_tree(self): self.my_bst.insert(5) self.my_bst.insert(3) self.my_bst.insert(6) self.my_bst.insert(8) self.my_bst.insert(5) self.my_bst.insert(11) self.my_bst.insert(2) self.assertEqual(self.my_bst.left.value, 3) self.assertEqual(self.my_bst.left.left.value, 2) self.assertEqual(self.my_bst.right.value, 6) self.assertEqual(self.my_bst.right.right.value, 8) self.assertEqual(self.my_bst.right.right.right.value, 11)
def test_depth(): tree = BSTree(4) assert tree.depth() == 1 tree.insert(2) assert tree.depth() == 2 tree.insert(6) assert tree.depth() == 2 tree.insert(1) tree.insert(3) tree.insert(5) tree.insert(7) assert tree.depth() == 3
def test_size(): tree = BSTree(4) assert tree.size() == 1 tree.insert(2) assert tree.size() == 2 tree.insert(6) assert tree.size() == 3 tree.insert(1) assert tree.size() == 4 tree.insert(3) assert tree.size() == 5 tree.insert(5) assert tree.size() == 6 tree.insert(7) assert tree.size() == 7
class CrossVerifier(object): """Checks whether a wire network has any crossing wires.""" def __init__(self, layer): """Verifier for a layer of wires. Once created, the verifier can list the crossings between wires (the wire_crossings method) or count the crossings (count_crossings).""" self.horizontal = [] self.verticalLines = [] self.events = [] self._events_from_layer(layer) self.events.sort() #array sort o(nlogn) self.horizontal.sort() arr = self.horizontal[:1] for i in range(1, len(self.horizontal)): if self.horizontal[i][0] != arr[len(arr) - 1][0]: arr.append(self.horizontal[i]) else: arr[len(arr) - 1][1] = arr[len(arr) - 1][1] + self.horizontal[i][1] self.horizontalLines = BSTree(arr) # for i in range(0, len(arr)): # print repr(arr[i]) + '\n' # print self.horizontalLines.displayTree() self.index = RangeIndex() self.result_set = ResultSet() self.performed = False def count_crossings(self): """Returns the number of pairs of wires that cross each other.""" if self.performed: raise self.performed = True return self._compute_crossings(True) def wire_crossings(self): """An array of pairs of wires that cross each other.""" if self.performed: raise self.performed = True return self._compute_crossings(False) def _events_from_layer(self, layer): """Populates the sweep line events from the wire layer.""" # left_edge = min([wire.x1 for wire in layer.wires.values()]) ### o(n) # Implementation to use a BSTree addded for wire in layer.wires.values(): ### o(n) if wire.is_horizontal(): # self.events.append([wire.x1, 0, wire.object_id, 'add', wire]) self.horizontal.append([wire.y1, [wire]]) else: self.events.append([wire.x1, 1, wire.object_id, 'query', wire]) # self.verticalLines.insert([wire.x1, [wire.object_id, wire]) def _compute_crossings(self, count_only): """Implements count_crossings and wire_crossings.""" if count_only: result = 0 else: result = self.result_set # counter = 0 for event in self.events: event_x, event_type, wire = event[0], event[3], event[4] self.trace_sweep_line(event_x) if event_type == 'query': cross_wires = [] lowerBound = self.horizontalLines.findByKey(wire.y1, True) upperBound = self.horizontalLines.findByKey( wire.y2, False, True) selectedNode = lowerBound while lowerBound.key <= upperBound.key and selectedNode and selectedNode.key <= upperBound.key: for potentialCrossWire in selectedNode.value: # print potentialCrossWire if wire.intersects(potentialCrossWire): cross_wires.append(potentialCrossWire) # counter += 1 selectedNode = selectedNode.nextNode() # print "counter while: " + str(counter) if count_only: result += len(cross_wires) else: for cross_wire in cross_wires: result.add_crossing(wire, cross_wire) # print "counter: " + str(counter) return result def trace_sweep_line(self, x): """When tracing is enabled, adds info about where the sweep line is. Args: x: the coordinate of the vertical sweep line """ # NOTE: this is overridden in TracedCrossVerifier pass
def setUp(self): self.my_bst = BSTree()
def test_insert_already_present(): tree = BSTree(4) tree.insert(4) assert tree.size() == 1
class testPrePostAndBreadth(unittest.TestCase): def setUp(self): self.my_bst = BSTree() self.filled_tree = BSTree() self.filled_tree.insert(10) self.filled_tree.insert(5) self.filled_tree.insert(15) self.filled_tree.insert(2) self.filled_tree.insert(12) self.filled_tree.insert(7) self.filled_tree.insert(17) self.filled_tree.insert(1) self.filled_tree.insert(4) self.filled_tree.insert(6) self.filled_tree.insert(9) self.filled_tree.insert(11) self.filled_tree.insert(14) self.filled_tree.insert(16) self.filled_tree.insert(23) self.imbalanced_tree = BSTree() self.imbalanced_tree.insert(10) self.imbalanced_tree.insert(5) self.imbalanced_tree.insert(15) self.imbalanced_tree.insert(2) self.imbalanced_tree.insert(12) self.imbalanced_tree.insert(7) self.imbalanced_tree.insert(17) self.imbalanced_tree.insert(4) self.imbalanced_tree.insert(6) self.imbalanced_tree.insert(9) self.imbalanced_tree.insert(14) self.imbalanced_tree.insert(23) self.number_catcher = [] def test_pre_order_on_empty_bst(self): for i in self.my_bst.pre_order(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, []) def test_pre_order_on_filled_bst(self): for i in self.filled_tree.pre_order(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, [10, 5, 2, 1, 4, 7, 6, 9, 15, 12, 11, 14, 17, 16, 23]) def test_post_order_on_empty_bst(self): for i in self.my_bst.post_order(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, []) def test_post_order_on_filled_bst(self): for i in self.filled_tree.post_order(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, [1, 4, 2, 6, 9, 7, 5, 11, 14, 12, 16, 23, 17, 15, 10]) def test_breadth_first_on_empty(self): for i in self.my_bst.breadth_first(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, []) pass def test_breadth_first_on_filled(self): for i in self.filled_tree.breadth_first(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, [10, 5, 15, 2, 7, 12, 17, 1, 4, 6, 9, 11, 14, 16, 23]) def test_breadth_first_on_imbalanced_tree(self): for i in self.imbalanced_tree.breadth_first(): self.number_catcher.append(i) self.assertEqual(self.number_catcher, [10, 5, 15, 2, 7, 12, 17, 4, 6, 9, 14, 23]) def testing_the_delete_method(self): pass
class TestingMyMethods(unittest.TestCase): """Now let's test the methods""" def setUp(self): self.my_bst = BSTree() self.filled_tree = BSTree() self.filled_tree.insert(5) self.filled_tree.insert(3) self.filled_tree.insert(6) self.filled_tree.insert(8) self.filled_tree.insert(11) self.filled_tree.insert(2) def test_the_contains_method_on_empty_tree(self): self.assertEqual(self.my_bst.contains(5), False) def test_contains_on_tree_that_doesnt_have_the_val(self): self.assertEqual(self.filled_tree.contains(1), False) self.assertEqual(self.filled_tree.contains(9), False) def test_contains_for_values_it_has(self): self.assertEqual(self.filled_tree.contains(8), True) self.assertEqual(self.filled_tree.contains(2), True) self.assertEqual(self.filled_tree.contains(5), True) self.assertEqual(self.filled_tree.contains(11), True) self.assertEqual(self.filled_tree.contains(6), True) self.assertEqual(self.filled_tree.contains(3), True) def test_size(self): self.assertEqual(self.my_bst.size(), 0) self.my_bst.insert(1) self.assertEqual(self.my_bst.size(), 1) self.assertEqual(self.filled_tree.size(), 6) self.filled_tree.insert(15) self.assertEqual(self.filled_tree.size(), 7) def test_the_depth_method(self): self.assertEqual(self.my_bst.depth(), 0) self.assertEqual(self.filled_tree.depth(), 4) self.filled_tree.insert(5422) self.assertEqual(self.filled_tree.depth(), 5) def test_balance(self): self.assertEqual(self.my_bst.balance(), 0) self.assertEqual(self.filled_tree.balance(), 1) self.filled_tree.insert(5422) self.assertEqual(self.filled_tree.balance(), 2)
def tree_rebalance_right_right(): tree = BSTree(2) tree.left = BSTree(1, tree) tree.right = BSTree(4, tree) tree.right.left = BSTree(3, tree.right) tree.right.right = BSTree(6, tree.right) tree.right.right.left = BSTree(5, tree.right.right) tree.right.right.right = BSTree(7, tree.right.right) tree.rebalance() actual = [n.key for n in tree.breadth_first()] expected = [4, 2, 6, 1, 3, 5, 7] assert tree.depth() == 3 assert tree.balance() == 0 assert actual == expected
def traverse_ex(): tree = BSTree(8) tree.left = BSTree(3, tree) tree.right = BSTree(10, tree) tree.left.left = BSTree(1, tree.left) tree.left.right = BSTree(6, tree.left) tree.right.right = BSTree(14, tree.right) tree.left.right.left = BSTree(4, tree.left.right) tree.left.right.right = BSTree(7, tree.left.right) tree.right.right.left = BSTree(13, tree.right.right) return tree
from bst import BSTree tr1 = BSTree() print "addition..." print tr1.AddValue(100) print tr1.AddValue(50) print tr1.AddValue(150) print tr1.AddValue(30) print tr1.AddValue(60) print tr1.AddValue(20) print tr1.AddValue(40) print tr1.AddValue(55) print tr1.AddValue(70) print tr1.AddValue(10) print tr1.AddValue(33) print tr1.AddValue(57) print tr1.AddValue(15) print tr1.AddValue(35) print "\nsearch..." print tr1.SearchValue(10) print tr1.SearchValue(23) print tr1.SearchValue(50) print tr1.SearchValue(12) print "\nPre order Traverse" tr1.TraversePreOrder(tr1.root) print "\n\ndeleting..." print tr1.DeleteValue(23) print tr1.DeleteValue(30) print tr1.DeleteValue(50) print "\nPre order Traverse" tr1.TraversePreOrder(tr1.root)
def compress(text): tree = BSTree() tree.root = huffman_coding(text) tree.print(tree.root)
class testNodeDeletion(unittest.TestCase): def setUp(self): self.my_bst = BSTree() self.solo_tree = BSTree() self.solo_tree.insert(10) self.left_tree = BSTree() self.left_tree.insert(10) self.left_tree.insert(5) self.right_tree = BSTree() self.right_tree.insert(10) self.right_tree.insert(15) self.filled_tree = BSTree() self.filled_tree.insert(10) self.filled_tree.insert(5) self.filled_tree.insert(15) self.filled_tree.insert(2) self.filled_tree.insert(12) self.filled_tree.insert(7) self.filled_tree.insert(17) self.filled_tree.insert(1) self.filled_tree.insert(4) self.filled_tree.insert(6) self.filled_tree.insert(9) self.filled_tree.insert(11) self.filled_tree.insert(14) self.filled_tree.insert(16) self.filled_tree.insert(23) def test_delete_on_empty_tree(self): self.assertEqual(self.my_bst.delete(7), None) def test_delete_on_one_node_tree(self): catcher = [] self.solo_tree.delete(10) for i in self.solo_tree.in_order(): catcher.append(i) self.assertEqual(catcher, [None]) def test_delete_on_node_with_left_only(self): catcher = [] self.left_tree.delete(10) for i in self.left_tree.in_order(): catcher.append(i) self.assertEqual(catcher, [5]) def test_delete_on_node_with_right_only(self): catcher = [] self.right_tree.delete(10) for i in self.right_tree.in_order(): catcher.append(i) self.assertEqual(catcher, [15]) def test_delete_for_value_that_doesnt_appear(self): catcher = [] self.filled_tree.delete(18) for i in self.filled_tree.in_order(): catcher.append(i) self.assertEqual(catcher, [10, 5, 15, 2, 7, 12, 17, 1, 4, 6, 9, 11, 14, 16, 23])