Esempio n. 1
0
    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 test_AddRight(self):
        tree = BinaryTree()
        root = tree.add_root( BinaryTreeNode(1) )

        #complex adding case, becasue nromal ones are covered with test_add()
        leftNode = BinaryTreeNode(2)
        rightNode = BinaryTreeNode(3)
        right = tree.add_right(root, rightNode)
        assert root.right == rightNode
        assert root.left == None
        left = tree.add_left(root, leftNode)

        tmp = tree.add_right(root, BinaryTreeNode(4))
        assert tmp.parent == root
        assert root.right == tmp
        assert tmp.left == None
        assert tmp.right == right
        assert root.left == left
Esempio n. 3
0
    def test_AddRight(self):
        tree = BinaryTree()
        root = tree.add_root(BinaryTreeNode(1))

        #complex adding case, becasue nromal ones are covered with test_add()
        leftNode = BinaryTreeNode(2)
        rightNode = BinaryTreeNode(3)
        right = tree.add_right(root, rightNode)
        assert root.right == rightNode
        assert root.left == None
        left = tree.add_left(root, leftNode)

        tmp = tree.add_right(root, BinaryTreeNode(4))
        assert tmp.parent == root
        assert root.right == tmp
        assert tmp.left == None
        assert tmp.right == right
        assert root.left == left
    def test_AddLeft(self):
        tree = BinaryTree()
        root = tree.add_root( BinaryTreeNode(1) )

        # complex adding case, because normal ones are covered with test_add()
        left = tree.add_left(root, BinaryTreeNode(2))
        assert root.right == None
        assert root.left.val == 2
        right = tree.add_right(root, BinaryTreeNode(3))

        tmp = tree.add_left(root, BinaryTreeNode(4))
        assert tmp.parent == root
        assert root.left == tmp
        assert tmp.left == left
        assert tmp.right == None
        assert root.right == right
Esempio n. 5
0
    def test_AddLeft(self):
        tree = BinaryTree()
        root = tree.add_root(BinaryTreeNode(1))

        # complex adding case, because normal ones are covered with test_add()
        left = tree.add_left(root, BinaryTreeNode(2))
        assert root.right == None
        assert root.left.val == 2
        right = tree.add_right(root, BinaryTreeNode(3))

        tmp = tree.add_left(root, BinaryTreeNode(4))
        assert tmp.parent == root
        assert root.left == tmp
        assert tmp.left == left
        assert tmp.right == None
        assert root.right == right
        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