给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。
示例 1:
输入:root = [10,5,15,3,7,null,18], low = 7, high = 15 输出:32 示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10 输出:23
解题思路
在递归的过程中,利用二叉搜索树的性质进行剪枝,例如当前递归的节点值是10,而搜索的范围是[11,20],因此就不需要遍历左子树了,因为左子树上所有的值都比当前的值要小。
代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func rangeSumBST(root *TreeNode, low int, high int) int {
res:=0
if root==nil{
return res
}
if root.Val>=low{
res+=rangeSumBST(root.Left,low,high)
}
if root.Val>=low&&root.Val<=high{
res+=root.Val
}
if root.Val<=high{
res+=rangeSumBST(root.Right,low,high)
}
return res
}
提交结果
优化思路
主要思路还是上面那样,但是程序逻辑进行了修改,当前节点不在搜索范围内的时候,直接返回左子树或者右子树的结果,不需要再像原来的代码一样,需要一个变量存储左右子树的返回值,并且判断当前节点是否在范围内,再决定是否将当前节点的值进行累加
代码
func rangeSumBST(root *TreeNode, low int, high int) int {
if root==nil{
return 0
}
if root.Val<low{
return rangeSumBST(root.Right,low,high)
}
if root.Val>high{
return rangeSumBST(root.Left,low,high)
}
return root.Val+ rangeSumBST(root.Left,low,high)+rangeSumBST(root.Right,low,high)
}