def runner(current): # loop to remove every link that larger than average sum_weight, edges = mst_graph.sum_weight(current.val[0]) # terminate when there is not edge to go if len(edges) is 0: return # sort weight desc edges.sort(key=lambda x: -x[2]) avg_weight = sum_weight / len(edges) btree = BinaryTree() btree.add_root(BinaryTreeNode(current.val)) left = btree.root right = None for edge in edges: # remove this link if edge[2] >= avg_weight: # remove the link mst_graph.double_unlink(edge[0], edge[1]) # add this link to the binary tree if edge[0] in left.val: parent = left else: parent = right left = btree.add_left(parent, BinaryTreeNode(mst_graph.connected_with(edge[0]))) right = btree.add_right(parent, BinaryTreeNode(mst_graph.connected_with(edge[1]))) # else or the last one if edge[2] < avg_weight or edge == edges[-1]: # groups are the display output of the btree groups = btree.leaves() for group in groups: new_node = MultiTreeNode(group) # add new group to the leat of the multi tree tree.add_child(current, new_node) # recursively run it runner(new_node) # if the link's weight has become smaller than avg_weight, # there is no need to keep going on break
def runner(current): # loop to remove every link that larger than average sum_weight, edges = mst_graph.sum_weight(current.val[0]) # terminate when there is not edge to go if len(edges) is 0: return # sort weight desc edges.sort(key=lambda x: -x[2]) avg_weight = sum_weight / len(edges) btree = BinaryTree() btree.add_root(BinaryTreeNode(current.val)) for edge in edges: # remove this link if edge[2] >= avg_weight: # remove the link mst_graph.double_unlink(edge[0], edge[1]) # add this link to the binary tree parent = btree.find(edge[0]) # if edge[0] in left.val: # parent = left # else: # parent = right left = btree.add_left(parent, BinaryTreeNode(mst_graph.connected_with(edge[0]))) right = btree.add_right(parent, BinaryTreeNode(mst_graph.connected_with(edge[1]))) # else or the last one if edge[2] < avg_weight or edge == edges[-1]: # groups are the display output of the btree groups = btree.leaves() for group in groups: new_node = MultiTreeNode(group) # add new group to the leat of the multi tree tree.add_child(current, new_node) # recursively run it runner(new_node) # if the link's weight has become smaller than avg_weight, # there is no need to keep going on break
def test_leaves(self): tree = BinaryTree() root = tree.add_root(BinaryTreeNode(5)) self.create_binary_search_tree(tree, [3,1,4,7,6,8]) assert tree.leaves() == [1, 4, 6, 8]
def test_leaves(self): tree = BinaryTree() root = tree.add_root(BinaryTreeNode(5)) self.create_binary_search_tree(tree, [3, 1, 4, 7, 6, 8]) assert tree.leaves() == [1, 4, 6, 8]