Skip to content

Instantly share code, notes, and snippets.

@priyankvex
Created October 19, 2019 12:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save priyankvex/6a07d485e41b3daea01c37fdc10ae153 to your computer and use it in GitHub Desktop.
Save priyankvex/6a07d485e41b3daea01c37fdc10ae153 to your computer and use it in GitHub Desktop.
Range sum in BST
class Node(object):
def __init__(self, value):
self.value = value
self.left = None
self.right = None
# Store the range of values
self.range = None
# Store the sum of the tree planted at this node
self.sum = None
class Solution(object):
def pre_compute_tree(self, node):
if not node:
return 0, ()
left = self.pre_compute_tree(node.left)
right = self.pre_compute_tree(node.right)
left_sum = left[0]
if len(left[1]) > 0:
left_min = left[1][0]
else:
left_min = None
right_sum = right[0]
if len(right[1]) > 0:
right_max = right[1][1]
else:
right_max = None
range_start = left_min or node.value
range_end = right_max or node.value
node_range = (range_start, range_end)
node_sum = left_sum + right_sum + node.value
node.range = node_range
node.sum = node_sum
return node.sum, node.range
def solve(self, node, range_start, range_end):
return self.helper(node, range_start, range_end)
def helper(self, node, range_start, range_end):
if not node:
return 0
node_range = node.range
if node_range[0] >= range_start and node_range[1] <= range_end:
return node.sum
if node.right and node_range[1] <= range_end:
right_sum = node.right.sum
else:
right_sum = self.helper(node.right, range_start, range_end)
if node.left and node_range[0] >= range_start:
left_sum = node.left.sum
else:
left_sum = self.helper(node.left, range_start, range_end)
current_sum = left_sum + right_sum
if range_start <= node.value <= range_end:
current_sum += node.value
return current_sum
if __name__ == "__main__":
root = Node(15)
root.left = Node(10)
root.right = Node(20)
root.left.left = Node(8)
root.left.right = Node(12)
root.right.left = Node(16)
Solution().pre_compute_tree(root)
ans = Solution().solve(root, 10, 16)
print(ans)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment