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].
Example 1:
Input: root = [10,5,15,3,7,null,18], low = 7, high = 15
Output: 32
Explanation: Nodes 7, 10, and 15 are in the range [7, 15]. 7 + 10 + 15 = 32.
Example 2:
Input: root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
Output: 23
Explanation: Nodes 6, 7, and 10 are in the range [6, 10]. 6 + 7 + 10 = 23.
Constraints:
The number of nodes in the tree is in the range [1, 2 * 104].
1 <= Node.val <= 105
1 <= low <= high <= 105
All Node.val are unique.
Solutions
Solution 1: DFS
We design a function \(dfs(root)\), which represents the sum of the values of all nodes in the subtree with \(root\) as the root, and the values are within the range \([low, high]\). The answer is \(dfs(root)\).
The execution logic of the function \(dfs(root)\) is as follows:
If \(root\) is null, return \(0\).
If the value \(x\) of \(root\) is within the range \([low, high]\), then the initial answer of the function \(dfs(root)\) is \(x\), otherwise it is \(0\).
If \(x > low\), it means that there may be nodes in the left subtree of \(root\) with values within the range \([low, high]\), so we need to recursively call \(dfs(root.left)\) and add the result to the answer.
If \(x < high\), it means that there may be nodes in the right subtree of \(root\) with values within the range \([low, high]\), so we need to recursively call \(dfs(root.right)\) and add the result to the answer.
Finally, return the answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Where \(n\) is the number of nodes in the binary search tree.
1 2 3 4 5 6 7 8 91011121314151617181920
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution:defrangeSumBST(self,root:Optional[TreeNode],low:int,high:int)->int:defdfs(root:Optional[TreeNode])->int:ifrootisNone:return0x=root.valans=xiflow<=x<=highelse0ifx>low:ans+=dfs(root.left)ifx<high:ans+=dfs(root.right)returnansreturndfs(root)
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcrangeSumBST(root*TreeNode,lowint,highint)int{vardfsfunc(*TreeNode)intdfs=func(root*TreeNode)(ansint){ifroot==nil{return0}x:=root.Valiflow<=x&&x<=high{ans+=x}ifx>low{ans+=dfs(root.Left)}ifx<high{ans+=dfs(root.Right)}return}returndfs(root)}