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()
def test_prepend(self): linked_list = LinkedList() linked_list.prepend(1) linked_list.prepend(2) assert linked_list.to_array() == [2, 1]
def __init__(self, data=None): if not data: data = [] self.trees = LinkedList() self.min_tree = None for i in data: self.insert(i)