def test_find(self): tree = BinaryTree() root = tree.add_root(BinaryTreeNode([1, 2, 3, 4, 5])) a = tree.add_left(root, BinaryTreeNode([1, 2, 3])) b = tree.add_right(a, BinaryTreeNode([3])) a = tree.add_left(a, BinaryTreeNode([1, 2])) b = tree.add_right(a, BinaryTreeNode([2])) a = tree.add_left(a, BinaryTreeNode([1])) b = tree.add_right(root, BinaryTreeNode([4, 5])) a = tree.add_left(b, BinaryTreeNode([4])) b = tree.add_right(b, BinaryTreeNode([5])) assert tree.find(3).val == [3] assert tree.find(4).val == [4]
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