def _testRemoveRoot(self): node = BSTNode(10) assert node.value == 10 node.delete(10) assert node.value is None
def testRemoveCompleteTree(self): ''' Builds a complete tree, then removes all its values but the root Tree: 10 / \ 8 12 / \ / \ 7 9 11 13 ''' # Note that the resulting tree depends on the insertion order. # This makes this a white-box test node = BSTNode(10) node.insert(8) node.insert(9) node.insert(7) node.insert(12) node.insert(11) node.insert(13) for i in range(7, 13): assert node.search(i) is not None assert node.search(i).value == i # First case: remove root node.delete(10) assert node.search(10) is None for i in [7, 8, 9, 11, 12, 13]: assert node.search(i) is not None assert node.search(i).value == i # The new node value should be it's sucessor's, which is 11 assert node.value == 11 ''' Partial Tree: 11 / \ 8 12 / \ \ 7 9 13 ''' # Second case: remove node with single right child node.delete(12) assert node.search(12) is None for i in [7, 8, 9, 11, 13]: assert node.search(i) is not None assert node.search(i).value == i ''' Partial Tree: 11 / \ 8 13 / \ 7 9 ''' # Third case: remove node with no children node.delete(13) assert node.search(13) is None for i in [7, 8, 9, 11]: assert node.search(i) is not None assert node.search(i).value == i ''' partial tree: 11 / 8 / \ 7 9 ''' # Fourth case: remove children with a single left child # First, remove 9 to make 7 a single child node.delete(9) assert node.search(9) is None # Now, remove 8 node.delete(8) assert node.search(8) is None for i in [7, 11]: assert node.search(i) is not None assert node.search(i).value == i ''' partial tree: 11 / 7 ''' # Remove 7 (single left child, again node.delete(7) assert node.search(7) is None assert node.search(11) is not None assert node.search(11).value == 11 # Remove root node.delete(11) for i in range(7, 13): assert node.search(i) is None