给定二叉搜索树的根结点 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:=0if 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)
}
优化后
给定二叉搜索树的根结点 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:=0if 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)
}