dsa_algos

A segment tree is a binary tree data structure use...

A segment tree is a binary tree data structure used for efficient range queries and updates on arrays, such as finding the sum or minimum in a subarray. It is especially useful when you need to perform multiple queries and updates on an array.

When to use a segment tree?

  • When you need to answer range queries (like sum, min, max) and also update elements efficiently.
  • Examples: Range sum queries, range minimum/maximum queries, dynamic interval problems.

Python Implementation Example on Leetcode 307. Range Sum Query - Mutable:

class NumArray:
    def __init__(self, nums: List[int], L: int = 0, R: int | None = None):
        if R is None: 
            R = len(nums) - 1
        self.L, self.R = L, R

        if L == R:    
            self.sum   = nums[L]
            self.left  = None
            self.right = None
        else:          
            M = (L + R) // 2
            self.left  = NumArray(nums, L, M)
            self.right = NumArray(nums, M + 1, R)
            self.sum   = self.left.sum + self.right.sum

    def update(self, index: int, val: int) -> None:
        if self.L == self.R:
            self.sum = val
            return
        M = (self.L + self.R) // 2
        if index > M:
            self.right.update(index, val)
        else:
            self.left.update(index, val)
        self.sum = self.left.sum + self.right.sum

    def sumRange(self, left: int, right: int) -> int:
        if self.L == left and self.R == right:
            return self.sum
        M = (self.L + self.R) // 2
        if left > M:
            return self.right.sumRange(left, right)
        elif right <= M:
            return self.left.sumRange(left, right)
        else: 
            return (self.left.sumRange(left, M) + self.right.sumRange(M + 1, right))

# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# obj.update(index,val)
# param_2 = obj.sumRange(left,right)

Complexité

  • Build: O(n)
  • query (interval): O(log n)
  • update (point): O(log n)
Chemin: dsa_algos/segment_tree.mdDernière mise à jour: 2025-08-11