Published on

Range Sum of BST

Authors
  • avatar
    Name
    Alex Noh
    Twitter

Introduction

Given the root node of a binary search tree and two integers low and high, return the sum of values of all nodes with a value in the inclusive range [low, high].

Solutions

1. Using DFS(Recursion)

This solution leverages the properties of the binary search tree (BST) to prune unnecessary branches and efficiently compute the sum.

main.py
def range_sum_of_bst(root: Optional[TreeNode], low: int, high: int) -> int:
    def dfs(node: Optional[TreeNode]) -> int:
        if node:
            # If node's value is less than low, skip the left subtree
            if node.val < low:
                return dfs(node.right)
            # If node's value is greater than high, skip the right subtree
            elif high < node.val:
                return dfs(node.left)
            # If node's value is within the range, include it and continue with both subtrees    
            else:
                return node.val + dfs(node.left) + dfs(node.right)
        return 0
    return dfs(root)

2. Using DFS(Stack)

This approach uses an iterative DFS with a stack to avoid recursion and efficiently traverse the tree.

main.py
def range_sum_of_bst(root: Optional[TreeNode], low: int, high: int) -> int:
    total = 0
    stack = [root]
    while stack:
        node = stack.pop()
        if node:
            if node.val < low:
                stack.append(node.right)
            elif high < node.val:
                stack.append(node.left)
            else:
                total += node.val
                stack.append(node.left)
                stack.append(node.right)
    return total

3. Using BFS(Queue)

This approach uses BFS technique with a queue to traverse the tree level by level.

main.py
def range_sum_of_bst(root: Optional[TreeNode], low: int, high: int) -> int:
    total = 0
    queue = collections.deque([root])
    while queue:
        node = queue.popleft()
        if node:
            if node.val < low:
                queue.append(node.right)
            elif high < node.val:
                queue.append(node.left)
            else:
                total += node.val
                queue.append(node.left)
                queue.append(node.right)
    return total

References