def test_case_5(): """ will build a tree like: 5(0) / \ 4(1) 8(0) / / \ 3(0) 6(0) 10(0) """ debug("test case 5") tree = AvlTree() test_data = [8, 4, 10, 3, 5, 6] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) debug(" {}({})".format(tree.root.value, tree.root.balance_factor)) debug(" / \\") l1_1 = tree.root.left l1_2 = tree.root.right debug("%s(%s) %s(%s)" % (l1_1.value, l1_1.balance_factor, l1_2.value, l1_2.balance_factor)) debug(" / / \\") l2_1 = l1_1.left l2_3 = l1_2.left l2_4 = l1_2.right debug("%s(%s) %s(%s) %s(%s)" % (l2_1.value, l2_1.balance_factor , l2_3.value, l2_3.balance_factor , l2_4.value, l2_4.balance_factor)) assert tree.root.left.left.value == 3 assert tree.root.left.balance_factor == 1 assert l2_4.value == 10
def test_case_1(): """ result: 2 1 4 3 5 """ debug("test case 1") tree = AvlTree() test_data = [1, 2, 3, 4, 5] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) assert tree.root.value == 2 assert tree.root.right.right.value == 5
def test_case_3(): """ tree: 8 5 9 10 the tree removed 10 will becomes: 8 5 9 """ debug("test case 3") tree = AvlTree() test_data = [8, 5, 9, 10] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) dele_node = tree.root.right.right tree.delete(dele_node) debug(" {}({})".format(tree.root.value, tree.root.balance_factor)) l1_1 = tree.root.left l1_2 = tree.root.right debug(" / \\") debug(" %s(%s) %s(%s)" % (l1_1.value, l1_1.balance_factor, l1_2.value, l1_2.balance_factor)) assert tree.root.right.value == 9 assert tree.root.right.balance_factor == 0
def test_case_7(): """ build a tree like : 8 5 8 8 and rm the node 5. result will be : 8 8 8 """ debug("test case 7") tree = AvlTree() test_data = [8, 5, 8, 8] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) dele_node = tree.root.left tree.delete(dele_node) assert tree.root.value == 8 assert tree.root.balance_factor == 0 debug(" {}({})".format(tree.root.value, tree.root.balance_factor)) debug("{}({}) {}({})".format(tree.root.left.value, tree.root.left.balance_factor, tree.root.right.value, tree.root.right.balance_factor))
def test_case_4(): """ if arr [8, 5, 9, 10,4,3,6] added in a tree one by one. finally the tree will be : 8 / \ 4 9 / \ \ 3 5 10 \ 6 and then, remove 9, because node 9 only has single child, so 9's child will replace 9's location like: 8 / \ 4 10 / \ 3 5 \ 6 and the tree(the rotnode is 8) need to be rebalanced. the result will be: 5(0) / \ 4(1) 8(0) / / \ 3(0) 6(0) 10(0) """ debug("test case 4") tree = AvlTree() test_data = [8, 5, 9, 10, 4, 3, 6] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) dele_node = tree.root.right tree.delete(dele_node) debug(" {}({})".format(tree.root.value, tree.root.balance_factor)) debug(" / \\") l1_1 = tree.root.left l1_2 = tree.root.right debug("%s(%s) %s(%s)" % (l1_1.value, l1_1.balance_factor, l1_2.value, l1_2.balance_factor)) debug(" / / \\") l2_1 = l1_1.left l2_3 = l1_2.left l2_4 = l1_2.right debug(" %s(%s) %s(%s) %s(%s) " % ( l2_1.value, l2_1.balance_factor, l2_3.value, l2_3.balance_factor, l2_4.value, l2_4.balance_factor))
def test_case_2(): debug("test case 2") tree = AvlTree() test_data = [8, 5, 9, 10, 3, 6, 7] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) # this tree is : # 8 # 5 9 # 3 6 10 # 7 # # remove 3 # the tree will becomes: # 8 # 6 9 # 5 7 10 dele_node = tree.root.left.left tree.delete(dele_node) debug(" {}({})".format(tree.root.value, tree.root.balance_factor)) l1_1 = tree.root.left l1_2 = tree.root.right debug(" / \\") debug(" %s(%s) %s(%s)" % (l1_1.value, l1_1.balance_factor, l1_2.value, l1_2.balance_factor)) l2_1 = l1_1.left l2_2 = l1_1.right l2_4 = l1_2.right debug("/ \\ \\") debug("%s %s %s" % (l2_1.value, l2_2.value, l2_4.value)) assert tree.root.value == 8 assert tree.root.right.value == 9 assert tree.root.right.balance_factor == -1 assert tree.root.left.right.value == 7 assert tree.root.left.right.balance_factor == 0
def test_case_6(): """ this tree is like: 10 10 10 10 / \ / \ / \ / \ 6 12 3 12 3 12 7 12 / \ \ -- rm 6 --> / \ \ --> \ \ --> / \ \ 3 7 14 3 7 14 7 14 3 8 14 \ \ \ 8 8 8 """ debug("test case 6") tree = AvlTree() test_data = [10, 6, 12, 14, 3, 7, 8] for item in test_data: temp_node = AvlTreeNode() temp_node.value = item tree.add(temp_node) dele_node = tree.root.left tree.delete(dele_node) debug(" {}({})".format(tree.root.value, tree.root.balance_factor)) l1_1 = tree.root.left l1_2 = tree.root.right debug(" {}({}) {}({})".format(l1_1.value, l1_1.balance_factor, l1_2.value, l1_2.balance_factor)) l2_1 = l1_1.left l2_2 = l1_1.right l2_4 = l1_2.right debug("{}({}) {}({}) {}({})".format(l2_1.value, l2_1.balance_factor, l2_2.value, l2_2.balance_factor, l2_4.value, l2_4.balance_factor)) assert tree.root.left.left.value == 3 assert tree.root.right.balance_factor == -1
def test_avl_3(): numbers = [5, 6, 1, 10, 50, 30, 20, 40, 70, 60, 80] T = AvlTree(numbers) assert T.in_order_list() == sorted(numbers)
def test_avl_2(): numbers = [5, 6, 1, 10, 50, 30, 20, 40, 70, 60, 80] T = AvlTree(numbers) assert T.pre_order_list() == [10, 5, 1, 6, 50, 30, 20, 40, 70, 60, 80]
def test_avl_1(): numbers = [10, 20, 30, 40, 50, 25] T = AvlTree(numbers) assert T.pre_order_list() == [30, 20, 10, 25, 40, 50]
def test_search_avl_2(): numbers = [10, 20, 30, 40, 50, 25] T = AvlTree(numbers) node = Node(20, Node(10), Node(25)) assert compare_nodes(T.search(20), node)
def test_search_avl_1(): numbers = [10, 20, 30, 40, 50, 25] T = AvlTree(numbers) assert T.search(30) == T.get_root()
def getDictTree(tree, node): children = [] if node.left is not tree.nil or node.right is not tree.nil: for child in [node.left, node.right]: if child is not tree.nil: children.append(getDictTree(tree, child)) else: children.append({"key": "none", "children": []}) nodedict = {} if hasattr(node, "colour"): nodedict["colour"] = node.colour nodedict["key"] = node.key nodedict["children"] = children return nodedict if __name__ == "__main__": N = 300 trees = { "bintree": BinaryTree(), "redblacktree": RedBlackTree(), "avltree": AvlTree() } run(trees, 150) import json for name, tree in trees.items(): f = open('/Users/tims/workspace/datavis/data/' + name + '.json', 'w') f.write(json.dumps(getDictTree(tree, tree.root), indent=True)) f.close()