- new_highest_candidates = []
- if deleted.left:
- new_highest_candidates.append(deleted.left.value.highest_in_subtree)
- if deleted.right:
- new_highest_candidates.append(deleted.right.value.highest_in_subtree)
- if len(new_highest_candidates):
- parent.value.highest_in_subtree = max(
- parent.value.high, max(new_highest_candidates)
- )
- else:
- parent.value.highest_in_subtree = parent.value.high
-
- def find_overlaps(self, x: NumericRange):
+ new_highest_candidates = [parent.value.high]
+ if parent.left:
+ new_highest_candidates.append(parent.left.value.highest_in_subtree)
+ if parent.right:
+ new_highest_candidates.append(parent.right.value.highest_in_subtree)
+ parent.value.highest_in_subtree = max(new_highest_candidates)
+
+ def find_one_overlap(self, x: NumericRange):
+ """Identify and return one overlapping node from the tree.
+
+ >>> tree = AugmentedIntervalTree()
+ >>> tree.insert(NumericRange(20, 24))
+ >>> tree.insert(NumericRange(18, 22))
+ >>> tree.insert(NumericRange(14, 16))
+ >>> tree.insert(NumericRange(1, 30))
+ >>> tree.insert(NumericRange(25, 30))
+ >>> tree.insert(NumericRange(29, 33))
+ >>> tree.insert(NumericRange(5, 12))
+ >>> tree.insert(NumericRange(1, 6))
+ >>> tree.insert(NumericRange(13, 18))
+ >>> tree.insert(NumericRange(16, 28))
+ >>> tree.insert(NumericRange(21, 27))
+ >>> tree.find_one_overlap(NumericRange(6, 7))
+ 1..30
+ """
+ return self._find_one_overlap(self.root, x)
+
+ def _find_one_overlap(self, root: bst.Node, x: NumericRange):
+ if root is None:
+ return
+
+ if root.value.overlaps_with(x):
+ return root.value
+
+ if root.left:
+ if root.left.value.highest_in_subtree >= x.low:
+ return self._find_one_overlap(root.left, x)
+
+ if root.right:
+ return self._find_one_overlap(root.right, x)
+
+ def find_all_overlaps(self, x: NumericRange):