Пример #1
0
    def consolidate(self):
        """
        Restructure the tree back to a binomial tree
        """
        trees_by_rank = {}
        tree_stack = Stack()

        for tree in self.trees:
            tree_stack.push(tree)

        # Iterate over the trees and merge trees of the same rank
        while not tree_stack.is_empty():
            tree = tree_stack.pop()

            if tree is None:
                continue

            if tree.rank in trees_by_rank:
                existing_tree = trees_by_rank[tree.rank]
                del trees_by_rank[tree.rank]
                tree_stack.push(tree.merge_min(existing_tree))

            else:
                trees_by_rank[tree.rank] = tree

        # Build a new tree list and find the new min node
        new_trees = trees_by_rank.values()
        self.trees = LinkedList()
        self.min_tree = None

        for new_tree in new_trees:
            self.trees.append(new_tree)
            if self.min_tree is None or self.min_tree.value.value > new_tree.value:
                self.min_tree = self.trees.get_tail_node()
Пример #2
0
    def test_prepend(self):

        linked_list = LinkedList()
        linked_list.prepend(1)
        linked_list.prepend(2)

        assert linked_list.to_array() == [2, 1]
Пример #3
0
    def __init__(self, data=None):
        if not data:
            data = []

        self.trees = LinkedList()

        self.min_tree = None

        for i in data:
            self.insert(i)