Ejemplo n.º 1
0
def test_random_avl(helper):
    length = 100
    avl = AVL()
    for _ in range(length):
        avl.insert(helper.get_int())
        assert avl.is_balanced()
    lst = avl.to_list()
    random.shuffle(lst)
    for num in lst:
        avl.remove(num)
        assert avl.is_balanced()
Ejemplo n.º 2
0
def test_avl_node(helper):
    with pytest.raises(TypeError):
        AVLNode(None)
    with pytest.raises(TypeError):
        AVLNode("  ")
    with pytest.raises(TypeError):
        AVLNode(AVL())
    with pytest.raises(TypeError):
        AVLNode(helper.get_string())
    with pytest.raises(TypeError):
        AVLNode(helper.get_list())
    # these shouldn't raise any erros
    for val in [helper.get_int(), helper.get_float()]:
        node = AVLNode(val)
        assert node.get_data() == val
        assert node.get_left() == node.get_right() is None
        assert node.get_children() == []
        assert node._height == 0
        assert node.get_children_heights() == [0, 0]
        assert node.is_balanced()
        with pytest.raises(TypeError):
            node.set_height(helper.get_string())
        with pytest.raises(TypeError):
            node.set_height(helper.get_float())
        with pytest.raises(ValueError):
            node.set_height(helper.get_neg_int())
Ejemplo n.º 3
0
def test_search_insert_remove_input(helper, avl=AVL()):
    assert None not in avl
    assert helper.get_string() not in avl
    assert helper.get_list() not in avl
    with pytest.raises(ValueError):
        avl.insert(None)
    with pytest.raises(TypeError):
        avl.insert(helper.get_string())
    with pytest.raises(TypeError):
        avl.insert(helper.get_list())

    with pytest.warns(UserWarning):
        avl.remove(None)
    with pytest.warns(UserWarning):
        avl.remove(helper.get_string())
    with pytest.warns(UserWarning):
        avl.remove(helper.get_list())
Ejemplo n.º 4
0
def test_empty_avl(avl=AVL()):
    assert avl.is_empty()
    assert len(avl) == 0
    assert avl.get_height() == 0
    assert avl.to_list() == []
    assert avl.count_leaf_nodes() == 0
    with pytest.warns(UserWarning):
        avl.is_balanced()
    with pytest.warns(UserWarning):
        avl.is_perfect()
    with pytest.warns(UserWarning):
        avl.is_strict()
    assert avl.preorder_traverse() == []
    assert avl.postorder_traverse() == []
    assert avl.inorder_traverse() == []
    assert avl.breadth_first_traverse() == []
    assert avl.traverse() == []
    with pytest.raises(IndexError):
        avl.get_max()
    with pytest.raises(IndexError):
        avl.get_min()
Ejemplo n.º 5
0
def test_simple_avl_tree(helper):
    # src: Data Structures and Algorithms in Python Book (page: 506)
    avl = AVL()
    avl.insert(44)
    avl.insert(17)
    avl.insert(78)
    avl.insert(32)
    avl.insert(50)
    avl.insert(88)
    avl.insert(48)
    avl.insert(62)
    avl.insert(54)

    helper.verify_bst_rules(avl._root)

    # test main methods
    assert not avl.is_empty()
    assert len(avl) == 9
    assert avl.get_height() == 3
    assert avl.count_leaf_nodes() == 4
    assert avl.is_balanced()
    assert not avl.is_perfect()
    assert not avl.is_strict()
    assert avl.to_list() == [44, 17, 62, 32, 50, 78, 48, 54, 88]

    assert avl.preorder_traverse() == [44, 17, 32, 62, 50, 48, 54, 78, 88]
    assert avl.postorder_traverse() == [32, 17, 48, 54, 50, 88, 78, 62, 44]
    assert avl.inorder_traverse() == [17, 32, 44, 48, 50, 54, 62, 78, 88]
    assert avl.breadth_first_traverse() == [44, 17, 62, 32, 50, 78, 48, 54, 88]
    assert avl.traverse() == [17, 32, 44, 48, 50, 54, 62, 78, 88]
    assert avl.get_max() == 88
    assert avl.get_min() == 17

    # test nodes-heights
    root = avl._root
    assert root.get_data() == 44
    assert root.get_height() == 3
    assert root.get_left().get_data() == 17
    assert root.get_left().get_height() == 1
    assert root.get_left().get_right().get_data() == 32
    assert root.get_left().get_right().get_height() == 0
    assert root.get_left().get_left() is None
    assert root.get_right().get_data() == 62
    assert root.get_right().get_height() == 2
    assert root.get_right().get_left().get_data() == 50
    assert root.get_right().get_left().get_height() == 1
    assert root.get_right().get_left().get_left().get_data() == 48
    assert root.get_right().get_left().get_left().get_height() == 0
    assert root.get_right().get_left().get_left().get_left() is None
    assert root.get_right().get_left().get_left().get_right() is None
    assert root.get_right().get_left().get_right().get_data() == 54
    assert root.get_right().get_left().get_right().get_height() == 0
    assert root.get_right().get_left().get_right().get_left() is None
    assert root.get_right().get_left().get_right().get_right() is None
    assert root.get_right().get_right().get_data() == 78
    assert root.get_right().get_right().get_height() == 1
    assert root.get_right().get_right().get_left() is None
    assert root.get_right().get_right().get_right().get_data() == 88
    assert root.get_right().get_right().get_right().get_height() == 0
    assert root.get_right().get_right().get_right().get_left() is None
    assert root.get_right().get_right().get_right().get_right() is None
    # clear
    avl.clear()
    test_empty_avl(avl)
Ejemplo n.º 6
0
def test_avl_one_value(helper):
    avl = AVL()
    val = helper.get_int()
    avl.insert(val)
    # test structure
    assert helper.verify_bst_rules(avl._root)
    assert avl._root.get_data() == val
    # test various methods
    assert avl.count_leaf_nodes() == 1
    assert avl.get_max() == val
    assert avl.get_min() == val
    assert avl.get_height() == 0
    assert avl.is_balanced()
    assert avl.is_perfect()
    assert avl.is_strict()
    # test __contains__
    assert val in avl
    assert 100 not in avl
    assert 1.1 not in avl
    # test __iter__ / traverse
    assert avl.to_list() == [val]
    assert avl.preorder_traverse() == [val]
    assert avl.depth_first_traverse() == [val]
    assert avl.postorder_traverse() == [val]
    assert avl.inorder_traverse() == [val]
    # test remove
    with pytest.warns(UserWarning):
        avl.remove(9)
    avl.remove(val)
    # test empty avl
    test_empty_avl(avl)
    # validate
    test_search_insert_remove_input(helper, avl)
Ejemplo n.º 7
0
def test_remove_avl(helper):
    # src: Data Structures and Algorithms in Python Book (page: 508)
    avl = AVL([44, 62, 17, 32, 50, 78, 48, 54, 88])
    avl.remove(17)
    avl.remove(50)
    avl.remove(62)

    helper.verify_bst_rules(avl._root)

    # test main methods
    assert not avl.is_empty()
    assert len(avl) == 6
    assert avl.get_height() == 2
    assert avl.count_leaf_nodes() == 3
    assert avl.is_balanced()
    assert not avl.is_perfect()
    assert not avl.is_strict()
    assert avl.to_list() == [54, 44, 78, 32, 48, 88]

    assert avl.preorder_traverse() == [54, 44, 32, 48, 78, 88]
    assert avl.postorder_traverse() == [32, 48, 44, 88, 78, 54]
    assert avl.inorder_traverse() == [32, 44, 48, 54, 78, 88]
    assert avl.breadth_first_traverse() == [54, 44, 78, 32, 48, 88]
    assert avl.traverse() == [32, 44, 48, 54, 78, 88]
    assert avl.get_max() == 88
    assert avl.get_min() == 32

    # test nodes-heights
    root = avl._root
    assert root.get_data() == 54
    assert root.get_height() == 2
    assert root.get_left().get_data() == 44
    assert root.get_left().get_height() == 1
    assert root.get_left().get_left().get_data() == 32
    assert root.get_left().get_left().get_height() == 0
    assert root.get_left().get_left().get_left() is None
    assert root.get_left().get_left().get_right() is None
    assert root.get_left().get_right().get_data() == 48
    assert root.get_left().get_right().get_height() == 0
    assert root.get_left().get_right().get_left() is None
    assert root.get_left().get_right().get_right() is None

    assert root.get_right().get_data() == 78
    assert root.get_right().get_height() == 1
    assert root.get_right().get_left() is None
    assert root.get_right().get_right().get_data() == 88
    assert root.get_right().get_right().get_height() == 0
    assert root.get_right().get_right().get_left() is None
    assert root.get_right().get_right().get_right() is None

    # clear
    avl.clear()
    test_empty_avl(avl)
Ejemplo n.º 8
0
def test_right_left_rotation(helper):
    avl = AVL()
    avl.insert(2)
    avl.insert(10)
    avl.insert(5)

    helper.verify_bst_rules(avl._root)

    # test main methods
    assert not avl.is_empty()
    assert len(avl) == 3
    assert avl.get_height() == 1
    assert avl.count_leaf_nodes() == 2
    assert avl.is_balanced()
    assert avl.is_perfect()
    assert avl.is_strict()
    assert avl.to_list() == [5, 2, 10]

    assert avl.preorder_traverse() == [5, 2, 10]
    assert avl.postorder_traverse() == [2, 10, 5]
    assert avl.inorder_traverse() == [2, 5, 10]
    assert avl.breadth_first_traverse() == [5, 2, 10]
    assert avl.traverse() == [2, 5, 10]
    assert avl.get_max() == 10
    assert avl.get_min() == 2

    # test nodes-heights
    root = avl._root
    assert root.get_data() == 5
    assert root.get_height() == 1
    assert root.get_left().get_data() == 2
    assert root.get_left().get_height() == 0
    assert root.get_left().get_left() is None
    assert root.get_left().get_right() is None
    assert root.get_right().get_data() == 10
    assert root.get_right().get_height() == 0
    assert root.get_right().get_left() is None
    assert root.get_right().get_right() is None

    # clear
    avl.clear()
    test_empty_avl(avl)
Ejemplo n.º 9
0
def test_avl_big_example(helper):
    # src: https://www.youtube.com/watch?v=7m94k2Qhg68
    avl = AVL()
    avl.insert(43)
    avl.insert(18)
    avl.insert(22)
    avl.insert(9)
    avl.insert(21)
    avl.insert(6)
    avl.insert(8)
    avl.insert(20)
    avl.insert(63)
    avl.insert(50)
    avl.insert(62)
    avl.insert(51)

    helper.verify_bst_rules(avl._root)

    # test main methods
    assert not avl.is_empty()
    assert len(avl) == 12
    assert avl.get_height() == 3
    assert avl.count_leaf_nodes() == 6
    assert avl.is_balanced()
    assert not avl.is_perfect()
    assert not avl.is_strict()
    assert avl.to_list() == [22, 18, 50, 8, 21, 43, 62, 6, 9, 20, 51, 63]

    assert avl.preorder_traverse() == \
        [22, 18, 8, 6, 9, 21, 20, 50, 43, 62, 51, 63]
    assert avl.postorder_traverse() == \
        [6, 9, 8, 20, 21, 18, 43, 51, 63, 62, 50, 22]
    assert avl.inorder_traverse() == \
        [6, 8, 9, 18, 20, 21, 22, 43, 50, 51, 62, 63]
    assert avl.breadth_first_traverse() == \
        [22, 18, 50, 8, 21, 43, 62, 6, 9, 20, 51, 63]
    assert avl.traverse() == [6, 8, 9, 18, 20, 21, 22, 43, 50, 51, 62, 63]
    assert avl.get_max() == 63
    assert avl.get_min() == 6

    # test nodes-heights
    root = avl._root
    assert root.get_data() == 22
    assert root.get_height() == 3
    assert root.get_left().get_data() == 18
    assert root.get_left().get_height() == 2
    assert root.get_left().get_left().get_data() == 8
    assert root.get_left().get_left().get_height() == 1
    assert root.get_left().get_left().get_left().get_data() == 6
    assert root.get_left().get_left().get_left().get_height() == 0
    assert root.get_left().get_left().get_left().get_left() is None
    assert root.get_left().get_left().get_left().get_right() is None
    assert root.get_left().get_left().get_right().get_data() == 9
    assert root.get_left().get_left().get_right().get_height() == 0
    assert root.get_left().get_left().get_right().get_left() is None
    assert root.get_left().get_left().get_right().get_right() is None
    assert root.get_left().get_right().get_data() == 21
    assert root.get_left().get_right().get_height() == 1
    assert root.get_left().get_right().get_right() is None
    assert root.get_left().get_right().get_left().get_data() == 20
    assert root.get_left().get_right().get_left().get_height() == 0
    assert root.get_left().get_right().get_left().get_left() is None
    assert root.get_left().get_right().get_left().get_right() is None

    assert root.get_right().get_data() == 50
    assert root.get_right().get_height() == 2
    assert root.get_right().get_left().get_data() == 43
    assert root.get_right().get_left().get_height() == 0
    assert root.get_right().get_left().get_left() is None
    assert root.get_right().get_left().get_right() is None
    assert root.get_right().get_right().get_data() == 62
    assert root.get_right().get_right().get_height() == 1
    assert root.get_right().get_right().get_left().get_data() == 51
    assert root.get_right().get_right().get_left().get_height() == 0
    assert root.get_right().get_right().get_right().get_data() == 63
    assert root.get_right().get_right().get_right().get_height() == 0
    assert root.get_right().get_right().get_right().get_left() is None
    assert root.get_right().get_right().get_right().get_right() is None

    # clear
    avl.clear()
    test_empty_avl(avl)