Ejemplo n.º 1
0
def test_simple_case(basic_tree):
    """Test the basic opeartions of a binary search tree."""
    tree = binary_search_tree.BinarySearchTree()

    assert tree.empty

    # 23, 4, 30, 11, 7, 34, 20, 24, 22, 15, 1
    for key, data in basic_tree:
        tree.insert(key=key, data=data)

    assert tree.empty is False
    assert tree.get_leftmost(node=tree.root).key == 1
    assert tree.get_leftmost(node=tree.root).data == "1"
    assert tree.get_rightmost(node=tree.root).key == 34
    assert tree.get_rightmost(node=tree.root).data == "34"
    assert tree.search(key=24).data == "24"
    assert tree.get_height(node=tree.root) == 4
    assert tree.get_predecessor(node=tree.root).key == 22
    temp = tree.search(key=24)
    assert tree.get_predecessor(node=temp).key == 23
    assert tree.get_successor(node=tree.root).key == 24

    tree.delete(key=15)
    tree.delete(key=22)
    tree.delete(key=7)
    tree.delete(key=20)

    with pytest.raises(tree_exceptions.KeyNotFoundError):
        tree.search(key=15)
def test_binary_search_tree_traversal_random():
    """Test binary search tree traversal with random sampling."""
    for _ in range(0, 10):

        insert_data = random.sample(range(1, 2000), 1000)

        tree = binary_search_tree.BinarySearchTree()
        for key in insert_data:
            tree.insert(key=key, data=str(key))

        preorder_recursive = [
            item for item in traversal.preorder_traverse(tree, True)
        ]
        preorder = [item for item in traversal.preorder_traverse(tree, False)]
        assert preorder_recursive == preorder

        inorder_recursive = [
            item for item in traversal.inorder_traverse(tree, True)
        ]
        inorder_nonrecursive = [
            item for item in traversal.inorder_traverse(tree, False)
        ]
        assert inorder_recursive == inorder_nonrecursive

        rinorder_recursive = [
            item for item in traversal.reverse_inorder_traverse(tree, True)
        ]
        rinorder_nonrecursive = [
            item for item in traversal.reverse_inorder_traverse(tree, False)
        ]
        assert rinorder_recursive == rinorder_nonrecursive

        postorder_recursive = [
            item for item in traversal.postorder_traverse(tree, True)
        ]
        postorder_nonrecursive = [
            item for item in traversal.postorder_traverse(tree, False)
        ]
        assert postorder_recursive == postorder_nonrecursive
Ejemplo n.º 3
0
    def do_build(self, line):
        """Build a binary tree.

        Options: avl-tree, bst, rb-tree, threaded-bst

        Example
        -------
        tree> build avl-tree
        """
        try:
            if self._tree is not None:
                print(f"Tree {type(self._tree)} already exist")
                return

            tree_type = self._get_single_arg(line=line).lower()

            if tree_type == "avl-tree":
                self._tree = avl_tree.AVLTree()
            elif tree_type == "bst":
                self._tree = binary_search_tree.BinarySearchTree()
            elif tree_type == "rb-tree":
                self._tree = red_black_tree.RBTree()
            elif tree_type == "threaded-bst":
                threaded_type = input("Please input threaded type "
                                      "(left, right, or double): ").lower()
                if threaded_type == "left":
                    self._tree = threaded_binary_tree.LeftThreadedBinaryTree()
                elif threaded_type == "right":
                    self._tree = threaded_binary_tree.RightThreadedBinaryTree()
                elif threaded_type == "double":
                    self._tree = threaded_binary_tree.DoubleThreadedBinaryTree(
                    )
                else:
                    print(f"{threaded_type} is an invalid threaded type")
            else:
                print(f"{tree_type} is an invalid tree type")
        except KeyError as error:
            print(error)
Ejemplo n.º 4
0
def test_deletion(basic_tree):
    """Test the deletion of a binary search tree."""
    tree = binary_search_tree.BinarySearchTree()

    # 23, 4, 30, 11, 7, 34, 20, 24, 22, 15, 1
    for key, data in basic_tree:
        tree.insert(key=key, data=data)

    # No child
    tree.delete(15)
    assert [item for item in traversal.levelorder_traverse(tree)] == [
        (23, "23"),
        (4, "4"),
        (30, "30"),
        (1, "1"),
        (11, "11"),
        (24, "24"),
        (34, "34"),
        (7, "7"),
        (20, "20"),
        (22, "22"),
    ]

    # One right child
    tree.delete(20)
    assert [item for item in traversal.levelorder_traverse(tree)] == [
        (23, "23"),
        (4, "4"),
        (30, "30"),
        (1, "1"),
        (11, "11"),
        (24, "24"),
        (34, "34"),
        (7, "7"),
        (22, "22"),
    ]

    # One left child
    tree.insert(key=17, data="17")
    tree.delete(22)
    assert [item for item in traversal.levelorder_traverse(tree)] == [
        (23, "23"),
        (4, "4"),
        (30, "30"),
        (1, "1"),
        (11, "11"),
        (24, "24"),
        (34, "34"),
        (7, "7"),
        (17, "17"),
    ]

    # Two children
    tree.delete(11)
    assert [item for item in traversal.levelorder_traverse(tree)] == [
        (23, "23"),
        (4, "4"),
        (30, "30"),
        (1, "1"),
        (17, "17"),
        (24, "24"),
        (34, "34"),
        (7, "7"),
    ]
Ejemplo n.º 5
0
def test_binary_search_tree_traversal(basic_tree):
    """Test binary search tree traversal."""
    tree = binary_search_tree.BinarySearchTree()

    for key, data in basic_tree:
        tree.insert(key=key, data=data)

    assert [item for item in traversal.postorder_traverse(tree)] == [
        (1, "1"),
        (7, "7"),
        (15, "15"),
        (22, "22"),
        (20, "20"),
        (11, "11"),
        (4, "4"),
        (24, "24"),
        (34, "34"),
        (30, "30"),
        (23, "23"),
    ]

    assert [item for item in traversal.postorder_traverse(tree, False)] == [
        (1, "1"),
        (7, "7"),
        (15, "15"),
        (22, "22"),
        (20, "20"),
        (11, "11"),
        (4, "4"),
        (24, "24"),
        (34, "34"),
        (30, "30"),
        (23, "23"),
    ]

    assert [item for item in traversal.preorder_traverse(tree)] == [
        (23, "23"),
        (4, "4"),
        (1, "1"),
        (11, "11"),
        (7, "7"),
        (20, "20"),
        (15, "15"),
        (22, "22"),
        (30, "30"),
        (24, "24"),
        (34, "34"),
    ]

    assert [item for item in traversal.preorder_traverse(tree, False)] == [
        (23, "23"),
        (4, "4"),
        (1, "1"),
        (11, "11"),
        (7, "7"),
        (20, "20"),
        (15, "15"),
        (22, "22"),
        (30, "30"),
        (24, "24"),
        (34, "34"),
    ]

    assert [item for item in traversal.inorder_traverse(tree)] == [
        (1, "1"),
        (4, "4"),
        (7, "7"),
        (11, "11"),
        (15, "15"),
        (20, "20"),
        (22, "22"),
        (23, "23"),
        (24, "24"),
        (30, "30"),
        (34, "34"),
    ]

    assert [item for item in traversal.inorder_traverse(tree, False)] == [
        (1, "1"),
        (4, "4"),
        (7, "7"),
        (11, "11"),
        (15, "15"),
        (20, "20"),
        (22, "22"),
        (23, "23"),
        (24, "24"),
        (30, "30"),
        (34, "34"),
    ]

    assert [item for item in traversal.reverse_inorder_traverse(tree)] == [
        (34, "34"),
        (30, "30"),
        (24, "24"),
        (23, "23"),
        (22, "22"),
        (20, "20"),
        (15, "15"),
        (11, "11"),
        (7, "7"),
        (4, "4"),
        (1, "1"),
    ]

    assert [item
            for item in traversal.reverse_inorder_traverse(tree, False)] == [
                (34, "34"),
                (30, "30"),
                (24, "24"),
                (23, "23"),
                (22, "22"),
                (20, "20"),
                (15, "15"),
                (11, "11"),
                (7, "7"),
                (4, "4"),
                (1, "1"),
            ]