예제 #1
0
    def _remove(self, node, key):
        """Remove (key,value) from subtree rooted at node and return resulting subtree."""
        if node is None:
            return None

        if key < node.key:
            node.left = self._remove(node.left, key)
            node = resolve_right_leaning(node)
        elif key > node.key:
            node.right = self._remove(node.right, key)
            node = resolve_left_leaning(node)
        else:
            if node.left is None:
                return node.right
            if node.right is None:
                return node.left

            # replace self value with largest value from left subtree
            original = node

            # find SMALLEST child in right subtree and remove it
            node = node.right
            while node.left:
                node = node.left

            node.right = self._remove_min(original.right)
            node.left = original.left

            node = resolve_left_leaning(node)

        node.compute_height()
        return node
예제 #2
0
    def _remove(self, node, val):
        """Remove val from subtree rooted at node and return resulting subtree."""
        if node is None:
            return None

        if val < node.value:
            node.left = self._remove(node.left, val)
            node = resolve_right_leaning(node)
        elif val > node.value:
            node.right = self._remove(node.right, val)
            node = resolve_left_leaning(node)
        else:
            if node.left is None:
                return node.right
            if node.right is None:
                return node.left

            # replace self value with node containing smallest value from right subtree
            original = node

            # find SMALLEST child in right subtree and remove it
            node = node.right
            while node.left:
                node = node.left

            node.right = self._remove_min(original.right)
            node.left = original.left

            # Might have made left-leaning by shrinking right side
            node = resolve_left_leaning(node)

        node.compute_height()
        return node
예제 #3
0
    def _remove_max(self, node):
        """
        Remove max and unwind, addressing AVL property on way back. Return
        pair (value, new root)
        """
        if node.right is None:
            return (node.value, node.left)

        (value, node.right) = self._remove_max(node.right)
        node = resolve_left_leaning(node)
        node.compute_height()
        return (value, node)
예제 #4
0
    def _insert(self, node, val):
        """Inserts a new BinaryNode to the tree containing this value."""
        if node is None:
            return BinaryNode(val)

        if val <= node.value:
            node.left = self._insert(node.left, val)
            node = resolve_left_leaning(node)
        else:
            node.right = self._insert(node.right, val)
            node = resolve_right_leaning(node)

        node.compute_height()
        return node
예제 #5
0
    def _insert(self, node, v, p):
        """Inserts a new BinaryNode to the tree containing (value, priority) pair."""
        if node is None:
            return BinaryNode(v, p)

        if p <= node.priority:
            node.left = self._insert(node.left, v, p)
            node = resolve_left_leaning(node)
        else:
            node.right = self._insert(node.right, v, p)
            node = resolve_right_leaning(node)

        node.compute_height()
        return node
예제 #6
0
    def _put(self, node, k, v):
        """
        Adds a new BinaryNode to the subtree rooted at node or update
        association of (k, v).
        """
        if node is None:
            return BinaryNode(k,v)

        if k == node.key:
            node.value = v
            return node

        if k < node.key:
            node.left = self._put(node.left, k, v)
            node = resolve_left_leaning(node)
        else:
            node.right = self._put(node.right, k, v)
            node = resolve_right_leaning(node)

        node.compute_height()
        return node