Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
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))
Beispiel #5
0
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))
Beispiel #6
0
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
Beispiel #7
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
Beispiel #8
0
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)
Beispiel #9
0
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]
Beispiel #10
0
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]
Beispiel #11
0
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)
Beispiel #12
0
def test_search_avl_1():
    numbers = [10, 20, 30, 40, 50, 25]
    T = AvlTree(numbers)
    assert T.search(30) == T.get_root()
Beispiel #13
0
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()