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
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
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)
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
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
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