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)}