def merge_binary_tree_along_path_to_leaf(merge_l: _Node, merge_r: _Node, merge_path: List[MergeInfo], pref='left'): b = NodeBuilder() if len(merge_path) == 0: if pref == 'left': return merge_l return merge_r merge_info = merge_path[0] if merge_info.dir == 'left': return b.mid( merge_binary_tree_along_path_to_leaf( merge_l.left.child, merge_r.left.child, merge_path[1:], pref=pref ), merge_r.right.child, lw=merge_info.lw, rw=merge_info.rw ) if merge_info.dir == 'right': return b.mid( merge_l.left.child, merge_binary_tree_along_path_to_leaf( merge_l.right.child, merge_r.right.child, merge_path[1:], pref=pref ), lw=merge_info.lw, rw=merge_info.rw ) raise RuntimeError()
def setUp(self): b = NodeBuilder() self.m1 = b.mid(b.mid(b.leaf("0"), b.leaf("1")), b.mid(b.leaf("2"), b.leaf("3"))) self.m2 = b.mid(b.mid(b.leaf("x0"), b.leaf("x1")), b.mid(b.leaf("x2"), b.leaf("x3")))
def construction1(root: _Node, source_nodes: List[int]): bld = NodeBuilder() av_nodes = len(root.leaf_nodes) if len(root.leaf_nodes) >= 2 ** root.depth: return bld.mid(root, bld.leaf(str(av_nodes))), source_nodes + [root] raise NotImplementedError
def setUp(self): b = NodeBuilder() self.m1 = b.mid(b.mid(b.leaf("0"), b.leaf("1"), lw=3, rw=2), b.mid(b.leaf("2"), b.leaf("3"), lw=4, rw=5), lw=1, rw=0) self.m2 = b.mid(b.mid(b.leaf("x0"), b.leaf("x1")), b.mid(b.leaf("x2"), b.leaf("x3")))
def setUp(self): bld = NodeBuilder() self.root1 = bld.mid(bld.leaf("0"), bld.leaf("1")) self.spt = ShortestPathTree(self.root1, depth=1) self.root2 = bld.mid(bld.mid(bld.leaf("0"), bld.leaf("1")), bld.mid(bld.leaf("2"), bld.leaf("3"))) self.spt2 = ShortestPathTree(self.root2, depth=2)
def single_node_at(current_node, idx_path, depth, name): bld = NodeBuilder() if depth == 1: l = bld.leaf(name) if idx_path == 1: # right node return bld.mid(current_node.left.child, l) else: return bld.only_left_child(l) if depth == 0: return bld.leaf(name) mask = 1 << (depth - 1) dir_right = idx_path & mask != 0 if dir_right: return bld.mid(current_node.left.child, single_node_at(current_node.right.child, idx_path - mask, depth - 1, name)) return bld.only_left_child(single_node_at(current_node.left.child, idx_path, depth - 1, name))
def construction0(node_name: int): node = NodeBuilder().leaf(str(node_name)) return node, [node]
def setUp(self): bld = NodeBuilder() self.r = bld.mid(bld.mid(bld.leaf("0"), bld.leaf("1")), bld.only_left_child(bld.leaf("2")))
def test_case_1(self): bld = NodeBuilder() r = bld.only_left_child(bld.leaf("0")) n = single_node_at(r, 1, 1, "1") self.assertEqual(n.depth, 1) self.assertEqual(str(n), "N:[e(0)=>[<0>]]-o-[e(0)=>[<1>]]")