def testInsertRandomRemoveRandom(self): tree = avltree.AVLTree() LEN=200 values = range(LEN) inserted = [] for i in range(LEN-1, -1, -1): v = values.pop(random.randint(0, i)) inserted.append(v) tree.insert(v) try: self.assertOrdered(tree.tree, -1, LEN-i) self.assertBalanced(tree.tree) except: print 'insertion order:', inserted raise values = range(LEN) for i in range(LEN-1, -1, -1): v = values.pop(random.randint(0, i)) savetree = tree.tree tree.delete(v) try: self.assertOrdered(tree.tree, values and values[0]-1 or -1, i) self.assertBalanced(tree.tree) except: print 'while deleting:', v, 'from:', savetree avltree.debug(savetree) raise
def testInsertRandomRemoveRandom(self): tree = avltree.AVLTree() LEN = 200 values = range(LEN) inserted = [] for i in range(LEN - 1, -1, -1): v = values.pop(random.randint(0, i)) inserted.append(v) tree.insert(v) try: self.assertOrdered(tree.tree, -1, LEN - i) self.assertBalanced(tree.tree) except: print 'insertion order:', inserted raise values = range(LEN) for i in range(LEN - 1, -1, -1): v = values.pop(random.randint(0, i)) savetree = tree.tree tree.delete(v) try: self.assertOrdered(tree.tree, values and values[0] - 1 or -1, i) self.assertBalanced(tree.tree) except: print 'while deleting:', v, 'from:', savetree avltree.debug(savetree) raise
def assertBalanced(self, tree): if tree is None: return 0 l, v, r, b = tree lh = self.assertBalanced(l) rh = self.assertBalanced(r) try: self.assertEquals(rh - lh, b, "incorrect balance factor") except: print 'rh:', rh, 'lh:', lh, 'b:', b avltree.debug(tree) raise self.failIf(b < -1, "unbalanced tree: left side too tall") self.failIf(b > 1, "unbalanced tree: right side too tall") return max(lh, rh) + 1