leetcode 938. 二叉搜索树的范围和-golang版本 | Go主题月

251 阅读1分钟

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

 

示例 1:

image.png

输入:root = [10,5,15,3,7,null,18], low = 7, high = 15 输出:32 示例 2:

image.png

输入: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
}

提交结果

image.png

优化思路

主要思路还是上面那样,但是程序逻辑进行了修改,当前节点不在搜索范围内的时候,直接返回左子树或者右子树的结果,不需要再像原来的代码一样,需要一个变量存储左右子树的返回值,并且判断当前节点是否在范围内,再决定是否将当前节点的值进行累加

代码

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

优化后

image.png