def test_insert_single_node(self): print("Running test_insert_single_node") h = BST() h.insert(5) self.assertEqual(h.get_root().get_key(), 5) self.assertEqual(str(h.get_root()), '5') self.check_multiline(str(h), [["5"], ["_", "_"], ["5"]])
def test_unique_insert(self): print("Running test_unique_insert") h = BST() a = h.insert(5) b = h.insert(5) c = h.insert(5) self.assertTrue(isinstance(a, Node)) self.assertEqual(h.get_root().get_left_child(), None) self.assertEqual(h.get_root().get_right_child(), None) self.assertEqual(b, None) self.assertEqual(c, None)
def test_child_parent_link(self): print("Running test_child_parent_link") h = BST([21, 17, 11, 15, 6, 5, 8, 1, 9]) n = h.get_root().get_left_child() self.assertEqual(n.get_key(), 17) self.assertEqual(n.get_right_child(), None) self.assertEqual(n.get_parent().get_key(), 21) self.assertEqual(n.get_left_child().get_left_child().get_key(), 6) self.assertEqual( n.get_left_child().get_left_child().get_parent().get_key(), 11)
def test_insert_3_nodes_3(self): print("Running test_insert_3_nodes_ordered") h = BST([5, 10, 6]) root = h.get_root() self.assertEqual(root.get_key(), 5) self.assertEqual(root.get_left_child(), None) self.assertEqual(root.get_right_child().get_key(), 10) self.assertEqual(root.get_right_child().get_left_child().get_key(), 6) self.check_multiline( str(h), [["5"], ["_", "10"], ["6", "_"], ["_", "_"], ["5", "6", "10"]])
def test_delete_connections(self): print("Running test_delete_connections") h = BST([20, 10, 25, 5, 18, 13, 15]) self.check_multiline(str(h), [["20"], ["10", "25"], ["5", "18", "_", "_"], ["_", "_", "13", "_"], ['_', '15'], ['_', '_'], ["5", "10", "13", "15", "18", "20", "25"]]) h.delete(10) self.check_multiline(str(h), [["20"], ["13", "25"], ["5", "18", "_", "_"], ["_", "_", "15", "_"], ['_', '_'], ["5", "13", "15", "18", "20", "25"]]) # Start checking all connections root = h.get_root() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child().get_key(), 13) self.assertEqual(root.get_right_child().get_key(), 25) # Check Left = 13 node_13 = root.get_left_child() self.assertEqual(node_13.get_key(), 13) self.assertEqual(node_13.get_parent().get_key(), 20) self.assertEqual(node_13.get_left_child().get_key(), 5) self.assertEqual(node_13.get_right_child().get_key(), 18) # Check Right = 25 node_25 = root.get_right_child() self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) # Check Left Left = 5 node_5 = node_13.get_left_child() self.assertEqual(node_5.get_key(), 5) self.assertEqual(node_5.get_parent().get_key(), 13) self.assertEqual(node_5.get_left_child(), None) self.assertEqual(node_5.get_right_child(), None) # Check Left Right = 18 node_18 = node_13.get_right_child() self.assertEqual(node_18.get_key(), 18) self.assertEqual(node_18.get_parent().get_key(), 13) self.assertEqual(node_18.get_left_child().get_key(), 15) self.assertEqual(node_18.get_right_child(), None) # Check Left Right Left = 15 node_15 = node_18.get_left_child() self.assertEqual(node_15.get_key(), 15) self.assertEqual(node_15.get_parent().get_key(), 18) self.assertEqual(node_15.get_left_child(), None) self.assertEqual(node_15.get_right_child(), None)
def delete(self, key): """Remove the Node object containing the key if the key exists in the AVL using the BST delete operation. In addition, it ensures that the AVL tree is still balanced after this operation is performed. Return the node that actually got removed from the AVL, which might be successor of the removed key.""" # Delete a key from the tree BST.delete(self, key) node = BST.search(self, key) root = BST.get_root(self) # Update balance and fix balance (rotate tree) if necessary self.update_balance(node) self.fix_balance(root)
def insert(self, key, value=None): """Create a new node for this key and value, and insert it into the AVL using the BST insert operation. In addition, it ensures that the AVL tree is still balanced after this operation is performed. Return the new inserted node, or None if the key and value could not be inserted.""" # Insert a key to the tree BST.insert(self, key, value) node = BST.search(self, key) root = BST.get_root(self) # Update balance and fix balance (rotate tree) if necessary self.update_balance(node) self.fix_balance(node)
def test_insert_connections(self): print("Running test_delete_case_3") h = BST() # Start checking all connections h.insert(20) root = h.get_root() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child(), None) self.assertEqual(root.get_right_child(), None) h.insert(25) node_25 = root.get_right_child() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child(), None) self.assertEqual(root.get_right_child().get_key(), 25) self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) h.insert(10) node_10 = root.get_left_child() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child().get_key(), 10) self.assertEqual(root.get_right_child().get_key(), 25) self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) self.assertEqual(node_10.get_key(), 10) self.assertEqual(node_10.get_parent().get_key(), 20) self.assertEqual(node_10.get_left_child(), None) self.assertEqual(node_10.get_right_child(), None) h.insert(18) node_18 = node_10.get_right_child() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child().get_key(), 10) self.assertEqual(root.get_right_child().get_key(), 25) self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) self.assertEqual(node_10.get_key(), 10) self.assertEqual(node_10.get_parent().get_key(), 20) self.assertEqual(node_10.get_left_child(), None) self.assertEqual(node_10.get_right_child().get_key(), 18) self.assertEqual(node_18.get_key(), 18) self.assertEqual(node_18.get_parent().get_key(), 10) self.assertEqual(node_18.get_left_child(), None) self.assertEqual(node_18.get_right_child(), None) h.insert(13) node_13 = node_18.get_left_child() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child().get_key(), 10) self.assertEqual(root.get_right_child().get_key(), 25) self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) self.assertEqual(node_10.get_key(), 10) self.assertEqual(node_10.get_parent().get_key(), 20) self.assertEqual(node_10.get_left_child(), None) self.assertEqual(node_10.get_right_child().get_key(), 18) self.assertEqual(node_18.get_key(), 18) self.assertEqual(node_18.get_parent().get_key(), 10) self.assertEqual(node_18.get_left_child().get_key(), 13) self.assertEqual(node_18.get_right_child(), None) self.assertEqual(node_13.get_key(), 13) self.assertEqual(node_13.get_parent().get_key(), 18) self.assertEqual(node_13.get_left_child(), None) self.assertEqual(node_13.get_right_child(), None) h.insert(5) node_5 = node_10.get_left_child() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child().get_key(), 10) self.assertEqual(root.get_right_child().get_key(), 25) self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) self.assertEqual(node_10.get_key(), 10) self.assertEqual(node_10.get_parent().get_key(), 20) self.assertEqual(node_10.get_left_child().get_key(), 5) self.assertEqual(node_10.get_right_child().get_key(), 18) self.assertEqual(node_18.get_key(), 18) self.assertEqual(node_18.get_parent().get_key(), 10) self.assertEqual(node_18.get_left_child().get_key(), 13) self.assertEqual(node_18.get_right_child(), None) self.assertEqual(node_13.get_key(), 13) self.assertEqual(node_13.get_parent().get_key(), 18) self.assertEqual(node_13.get_left_child(), None) self.assertEqual(node_13.get_right_child(), None) self.assertEqual(node_5.get_key(), 5) self.assertEqual(node_5.get_parent().get_key(), 10) self.assertEqual(node_5.get_left_child(), None) self.assertEqual(node_5.get_right_child(), None) h.insert(15) node_15 = node_13.get_right_child() self.assertEqual(root.get_key(), 20) self.assertEqual(root.get_parent(), None) self.assertEqual(root.get_left_child().get_key(), 10) self.assertEqual(root.get_right_child().get_key(), 25) self.assertEqual(node_25.get_key(), 25) self.assertEqual(node_25.get_parent().get_key(), 20) self.assertEqual(node_25.get_left_child(), None) self.assertEqual(node_25.get_right_child(), None) self.assertEqual(node_10.get_key(), 10) self.assertEqual(node_10.get_parent().get_key(), 20) self.assertEqual(node_10.get_left_child().get_key(), 5) self.assertEqual(node_10.get_right_child().get_key(), 18) self.assertEqual(node_18.get_key(), 18) self.assertEqual(node_18.get_parent().get_key(), 10) self.assertEqual(node_18.get_left_child().get_key(), 13) self.assertEqual(node_18.get_right_child(), None) self.assertEqual(node_13.get_key(), 13) self.assertEqual(node_13.get_parent().get_key(), 18) self.assertEqual(node_13.get_left_child(), None) self.assertEqual(node_13.get_right_child().get_key(), 15) self.assertEqual(node_5.get_key(), 5) self.assertEqual(node_5.get_parent().get_key(), 10) self.assertEqual(node_5.get_left_child(), None) self.assertEqual(node_5.get_right_child(), None) self.assertEqual(node_15.get_key(), 15) self.assertEqual(node_15.get_parent().get_key(), 13) self.assertEqual(node_15.get_left_child(), None) self.assertEqual(node_15.get_right_child(), None) self.check_multiline(str(h), [["20"], ["10", "25"], ["5", "18", "_", "_"], ["_", "_", "13", "_"], ['_', '15'], ['_', '_'], ["5", "10", "13", "15", "18", "20", "25"]])
def test_height_insert_delete_2(self): print("Running test_height_insert_delete_2") h = BST() h.insert(5) self.assertEqual(h.get_root().get_height(), 0) h.insert(2) self.assertEqual(h.get_root().get_height(), 1) self.assertEqual(h.get_root().get_left_child().get_height(), 0) h.insert(8) self.assertEqual(h.get_root().get_height(), 1) self.assertEqual(h.get_root().get_left_child().get_height(), 0) self.assertEqual(h.get_root().get_right_child().get_height(), 0) h.insert(1) self.assertEqual(h.get_root().get_height(), 2) self.assertEqual(h.get_root().get_right_child().get_height(), 0) self.assertEqual(h.get_root().get_left_child().get_height(), 1) self.assertEqual( h.get_root().get_left_child().get_left_child().get_height(), 0) h.insert(3) self.assertEqual(h.get_root().get_height(), 2) self.assertEqual(h.get_root().get_right_child().get_height(), 0) self.assertEqual(h.get_root().get_left_child().get_height(), 1) self.assertEqual( h.get_root().get_left_child().get_left_child().get_height(), 0) self.assertEqual( h.get_root().get_left_child().get_right_child().get_height(), 0) h.insert(9) self.assertEqual(h.get_root().get_height(), 2) self.assertEqual(h.get_root().get_right_child().get_height(), 1) self.assertEqual( h.get_root().get_right_child().get_right_child().get_height(), 0) self.assertEqual(h.get_root().get_left_child().get_height(), 1) self.assertEqual( h.get_root().get_left_child().get_left_child().get_height(), 0) self.assertEqual( h.get_root().get_left_child().get_right_child().get_height(), 0) h.insert(10) self.assertEqual(h.get_root().get_height(), 3) self.assertEqual(h.get_root().get_right_child().get_height(), 2) self.assertEqual( h.get_root().get_right_child().get_right_child().get_height(), 1) self.assertEqual( h.get_root().get_right_child().get_right_child().get_right_child(). get_height(), 0) self.assertEqual(h.get_root().get_left_child().get_height(), 1) self.assertEqual( h.get_root().get_left_child().get_left_child().get_height(), 0) self.assertEqual( h.get_root().get_left_child().get_right_child().get_height(), 0) self.check_multiline(str(h), [["5"], ["2", "8"], ["1", "3", "_", "9"], ["_", "_", "_", "_", "_", "10"], ["_", "_"], ["1", "2", "3", "5", "8", "9", "10"]]) h.delete(1) h.delete(3) self.assertEqual(h.get_root().get_height(), 3) self.assertEqual(h.get_root().get_right_child().get_height(), 2) self.assertEqual( h.get_root().get_right_child().get_right_child().get_height(), 1) self.assertEqual( h.get_root().get_right_child().get_right_child().get_right_child(). get_height(), 0) self.assertEqual(h.get_root().get_left_child().get_height(), 0) self.check_multiline( str(h), [["5"], ["2", "8"], ["_", "_", "_", "9"], ["_", "10"], ["_", "_"], ["2", "5", "8", "9", "10"]])