Ejemplo n.º 1
0
def joinable_rb_delete(T, z):
    if z.left is None or z.right is None:
        y = z
    else:
        y = rb_successor(z)
    if y.left is not None:
        x = y.left
    else:
        x = y.right
    if x is None:
        x = Node(None)  # create a dummy node that will mimic sentinel
    x.p = y.p
    if y.p is None:
        T.root = x
    else:
        if y is y.p.left:
            y.p.left = x
        else:
            y.p.right = x
    if y is not z:
        z.key = y.key
        z.data = y.data
    if y.color == Black:
        joinable_rb_delete_fixup(T, x)
    if x.key is None:  # if x is the dummy node replace it with None
        if x is T.root:
            T.root = None
            T.bh = 0
        else:
            if x is x.p.left:
                x.p.left = None
            else:
                x.p.right = None
    return y
Ejemplo n.º 2
0
def joinable_rb_delete(T, z):
    if z.left is None or z.right is None:
        y = z
    else:
        y = rb_successor(z)
    if y.left is not None:
        x = y.left
    else:
        x = y.right
    if x is None:
        x = Node(None)  # create a dummy node that will mimic sentinel
    x.p = y.p
    if y.p is None:
        T.root = x
    else:
        if y is y.p.left:
            y.p.left = x
        else:
            y.p.right = x
    if y is not z:
        z.key = y.key
        z.data = y.data
    if y.color == Black:
        joinable_rb_delete_fixup(T, x)
    if x.key is None:  # if x is the dummy node replace it with None
        if x is T.root:
            T.root = None
            T.bh = 0
        else:
            if x is x.p.left:
                x.p.left = None
            else:
                x.p.right = None
    return y
Ejemplo n.º 3
0
    def test_create_red_black_tree(self):
        left = Node(3)
        right = Node(20)
        root = Node(17, left=left, right=right)
        tree = RedBlackTree(root)

        assert_that(tree.root, is_(root))
        assert_that(root.left, is_(left))
        assert_that(root.right, is_(right))
        assert_parent_pointers_consistent(tree, sentinel=tree.nil)
 def test_get_child_no(self):
     node = Node(3)
     self.assertEqual(node._get_child_no(), 0)
     node._left = Node(1)
     self.assertEqual(node._get_child_no(), 1)
     node._right = Node(4)
     self.assertEqual(node._get_child_no(), 2)
Ejemplo n.º 5
0
    def test_min_gap_tree(self):
        _, keys = get_random_unique_array()
        tree = RedBlackTree()
        tree.nil.min_key = tree.nil.min_gap = math.inf
        tree.nil.max_key = -math.inf

        for key in keys:
            min_gap_insert(tree, Node(key))

        nodes = get_binary_tree_nodes(tree, sentinel=tree.nil)

        while nodes:
            node = random.choice(nodes)
            key = node.key
            keys.remove(key)

            actual_found = min_gap_search(tree, key)
            assert_that(actual_found.key, is_(equal_to(key)))

            min_gap_delete(tree, node)

            actual_found = min_gap_search(tree, key)
            assert_that(actual_found, is_(tree.nil))

            actual_min_gap = min_gap(tree)

            expected_min_gap = get_expected_min_gap(keys)
            assert_that(actual_min_gap, is_(equal_to(expected_min_gap)))
            nodes = get_binary_tree_nodes(tree, sentinel=tree.nil)
 def test_find(self):
     node = Node(3)
     node.insert(1)
     node.insert(0)
     node.insert(5)
     node = node._parent
     self.assertTrue(node.find(0))
     self.assertTrue(node.find(5))
     self.assertFalse(node.find(10))
 def test_get_inorder(self):
     node = Node(3)
     node.insert(1)
     node.insert(5)
     self.assertListEqual([(1, NodeColor.RED), (3, NodeColor.BLACK),
                           (5, NodeColor.RED)], node.get_inorder())
     node.insert(6)
     self.assertListEqual([(1, NodeColor.BLACK), (3, NodeColor.BLACK),
                           (5, NodeColor.BLACK), (6, NodeColor.RED)],
                          node.get_inorder())
Ejemplo n.º 8
0
    def test_rb_parentless_insert(self):
        keys = [random.randrange(1000) for _ in range(20)]
        tree = RedBlackTree()

        for key in keys:

            parentless_rb_insert(tree, Node(key))

            assert_red_black_tree(tree, sentinel=tree.nil)

        actual_keys = get_binary_tree_keys(tree, sentinel=tree.nil)
        assert_that(actual_keys, contains_inanyorder(*keys))
Ejemplo n.º 9
0
    def test_rb_insert(self):
        _, keys = get_random_array()
        tree = RedBlackTree()

        for key in keys:

            rb_insert(tree, Node(key), sentinel=tree.nil)

            assert_red_black_tree(tree, sentinel=tree.nil)
            assert_parent_pointers_consistent(tree, sentinel=tree.nil)

        actual_keys = get_binary_tree_keys(tree, sentinel=tree.nil)
        assert_that(actual_keys, contains_inanyorder(*keys))
Ejemplo n.º 10
0
    def test_joinable_rb_insert(self):
        keys = [random.randrange(1000) for _ in range(20)]
        tree = RedBlackTree(sentinel=None)
        tree.bh = 0

        for key in keys:

            joinable_rb_insert(tree, Node(key))

            assert_red_black_tree(tree)
            assert_parent_pointers_consistent(tree)

        actual_keys = get_binary_tree_keys(tree)
        assert_that(actual_keys, contains_inanyorder(*keys))
        actual_black_height = calculate_black_height(tree.root)
        assert_that(tree.bh, is_(equal_to(actual_black_height)))
Ejemplo n.º 11
0
def activity_scheduler(s, f):
    n = s.length
    A = Array.indexed(1, n)
    F = Array(list(rbetween(n, 1)))
    F.top = n
    B = RedBlackTree()
    # events contains triples (a, b, c) where a = 0 if the event is finish of an activity and 1 if it is start,
    # b as the activity number, and c as the start time or the finish time
    events = [(0, i + 1, finish_time) for i, finish_time in enumerate(f)] + \
             [(1, i + 1, start_time) for i, start_time in enumerate(s)]
    events.sort(key=lambda e: (e[2], e[0]))
    for e in events:
        if e[0] == 1:
            hall_number = pop(F)
            A[e[1]] = hall_number
            rb_insert(B, Node(e[1], data=hall_number), sentinel=B.nil)
        else:
            hall = rb_search(B.root, e[1], sentinel=B.nil)
            push(F, hall.data)
            rb_delete(B, hall, sentinel=B.nil)
    return A
Ejemplo n.º 12
0
    def test_rb_join(self):
        tree1, _, keys1 = get_random_red_black_tree(
            black_height=random.randint(0, 4),
            min_value=0,
            max_value=999,
            sentinel=None)
        tree1.bh = calculate_black_height(tree1.root)
        middle_key = random.randint(1000, 1999)
        x = Node(middle_key)
        tree2, _, keys2 = get_random_red_black_tree(
            black_height=random.randint(0, 4),
            min_value=2000,
            max_value=2999,
            sentinel=None)
        tree2.bh = calculate_black_height(tree2.root)

        actual_joined_tree = rb_join(tree1, x, tree2)

        assert_red_black_tree(actual_joined_tree)
        actual_keys = get_binary_tree_keys(actual_joined_tree)
        assert_that(actual_keys,
                    contains_inanyorder(*(keys1 + [middle_key] + keys2)))
 def test_right_left_case(self):
     root = Node(15)
     root._color = NodeColor.BLACK
     root._left = Node(7)
     root._left._color = NodeColor.BLACK
     root._left._parent = root
     root._right = Node(25)
     root._right._color = NodeColor.RED
     root._right._parent = root
     self.assertListEqual([(7, NodeColor.BLACK), (15, NodeColor.BLACK),
                           (25, NodeColor.RED)], root.get_inorder())
     root.insert(24)
     root = root._parent
     self.assertListEqual([(7, NodeColor.BLACK), (15, NodeColor.RED),
                           (24, NodeColor.BLACK), (25, NodeColor.RED)],
                          root.get_inorder())
 def test_str(self):
     node = Node(1)
     self.assertEqual(str(node), "1B")
     node._color = NodeColor.RED
     self.assertEqual(str(node), "1R")
 def test_insert(self):
     node = Node(3)
     self.assertFalse(node.insert(3))
     self.assertTrue(node.insert(1))